【问题标题】:Counting the number of swaps in `base::sort` in R计算 R 中 `base::sort` 中的交换次数
【发布时间】:2021-10-12 09:22:37
【问题描述】:

base::sort 函数返回无序向量的升序(降序)。

X <- c(3,4,2,5,1)
sort(X)
[1] 1 2 3 4 5

有没有办法统计函数执行交换的次数以获得有序向量?

【问题讨论】:

  • 给定示例中预期的交换次数是多少?
  • @tmfmnk : 是 4: (3,4,2,5,1) - (1,4,2,5,3) - (1,2,4,5,3) - (1,2,3,5,4) - (1,2,3,4,5)
  • 不取决于排序算法。 2 也可能是一个有效数字,不是吗? (3,4,2,5,1) - (2,3,4,5,1) - (1,2,3,4,5)?
  • 我认为base::sort 实现了多种排序算法。您是对base::sort 感兴趣,还是对特定方法的交换次数感兴趣?
  • @coffeinjunky 我对获得有序向量所需的最少交换次数感兴趣。 base::sort 对小向量使用 auto/radix 方法

标签: r sorting swap


【解决方案1】:

stringdist 包可以对字符串进行这种计算。因此,如果您有足够数量的符号,则可以使用它。例如:

X <- c(3,4,2,5,1)
Y <- sort(X)

# Convert to strings
tostring <- function(x, symbols = sort(unique(x))) {
  alphabet <- c(letters, LETTERS)
  if (length(symbols) > length(alphabet))
    stop("You need a bigger alphabet!")
  if (any(! x %in% symbols))
    stop("x has unknown symbols!")
  paste(alphabet[match(x, symbols)], collapse="")
}

symboldist <- function(x, y, method = "osa") {
  symbols <- unique(c(x, y))
  stringdist::stringdist(tostring(x, symbols), tostring(y, symbols), 
                         method = method)
}

symboldist(X, Y)
#> [1] 4

reprex package (v2.0.0) 于 2021 年 8 月 8 日创建

编辑添加:看起来“换位距离”是您想要的。这是一个基于 Javascript 的实现,位于 https://www.geeksforgeeks.org/number-of-transpositions-in-a-permutation/

# Translation of Javascript transposition distance calculation
# from https://www.geeksforgeeks.org/number-of-transpositions-in-a-permutation/

transpositionDistance <- function(P) {
  dfs <- function(i) {
    result <- 0
    while (!visited[i]) {
      visited[i] <<- TRUE
      i <- goesTo[i]
      result <- result + 1
    }
    result
  }
  
  # Convert P into a permutation of 1:n
  P <- match(P, sort(P))
  
  n <- length(P)
  if (!all(seq_len(n) %in% P))
    stop("this only works on permutations of unique elements")
  visited <- logical(n)
  goesTo <- integer(n)
  
  goesTo[P] <- seq_along(P)
  transpositions <- 0
  for (i in seq_len(n))
    if (!visited[i])
      transpositions <- transpositions + dfs(i) - 1
  transpositions
}

transpositionDistance(c(3,4,2,5,1))
#> [1] 4
transpositionDistance(c(1,3,5,2,4))
#> [1] 3
transpositionDistance(c(1,4,3,2,5))
#> [1] 1

【讨论】:

  • 感谢您的回答。但是,尝试不同的向量,例如 X &lt;- c(1,3,5,2,4),函数 symboldist(X, Y) 返回 4,而不是 3(所需的最小交换次数)。
  • 使用 method = "dl" 在该对上给出 3。您需要阅读stringdist() 上的帮助,以确定哪个距离指标最符合您的期望。
  • 在这两种情况下(并尝试其他方法),字符串X &lt;- c(1,4,3,2,5) 不会像预期的那样返回1
  • 效果很好,也适用于更大的矢量。现在很容易计算给定无序向量的转置奇偶性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 2021-02-06
相关资源
最近更新 更多