如何重新排序向量,使连续的整数不是彼此相邻?

时间:2017-03-16 22:56:34

标签: r

假设我有一个整数向量x

x = c(1:3,6:7)

我需要重新排序x,这样如果x中存在任何连续的整数,它们就不会彼此相邻(如果可能的话)。现在我有一个循环。还有更好的方法吗?

x中的值不一定是唯一的。但是现在你可以假设以我想要的方式排列x总是可能的(我实际上需要找到一种方法来确定x是否可以按照我上面提到的方式进行排列,但这可能是第二个问题)。

set.seed(42)
while(any(abs(diff(x)) == 1)){
    x = sample(x)
    print(x)
}
#[1] 7 6 1 2 3
#[1] 1 3 7 6 2
#[1] 7 2 6 1 3

3 个答案:

答案 0 :(得分:3)

我头脑中的一种可能性:稍微修改后的冒泡排序,您可以交换const getLargestElement = (arr) => arr.length ? Math.max(...arr.filter(i => Number(i) === i)) : 0;

x[j] + 1 == x[j + 1]

这有时间复杂度# Bubble sort implementation from: # https://www.r-bloggers.com/bubble-sorting-in-r-c-and-julia-code-improvements-and-the-r-compiler/ bubble_sort = function(vec) { no_passes = 0 while(1) { no_swaps = 0 for (j in 1 : (length(vec) - 1 - no_passes)) { if (vec[j] + 1 == vec[j + 1]) { s = vec[j] vec[j] = vec[j+1] vec[j+1] = s no_swaps = no_swaps + 1 } } no_passes = no_passes + 1 if(no_swaps == 0) break } vec } x = c(1:3,6:7) bubble_sort(x) ,但你现在所做的实际上是一个bogosort,O(N^2)

答案 1 :(得分:3)

这是一种更具R风格的方式:

myfunc <- function(y) {
    yt <- table(y)
    yt <- structure(.Data=as.vector(yt), .Names=names(yt))
    ys <- sort(as.numeric(names(yt)))
    ys <- c(ys[seq(1,length(ys),2)],ys[seq(2,length(ys),2)])
    result <- lapply(ys, function(i) rep(i,yt[as.character(i)]))
    result <- do.call(c, result)
    return(result)
}

res <- myfunc(c(1,5,7,8,3,7,9,2,6,3,87,7,3,1,1,1,3))
print(res)
[1]  1  1  1  1  3  3  3  3  6  8 87  2  5  7  7  7  9

print(any(abs(diff(res)) == 1))
[1] FALSE

答案 2 :(得分:1)

以下是我之前评论的解决方案草图:

  1. 使用对于输入字段具有足够diffusion的最简单散列来散列向量的每个元素,并将其存储在另一个输出向量中。看起来R有这个职位的digest库。
  2. 按递增/递减顺序对输出向量进行排序,并存储重新排序索引的向量,R将为您提供sort()
  3. 使用重新排序的索引对原始向量进行索引。
  4. 大多数哈希函数都是通过输出中的单个更改来彻底改变的,因此md5(1)不应该连续md5(2),但概率很高:

    $ echo 1 | md5
    b026324c6904b2a9cb4b88d6d61c81d1
    
    $ echo 2 | md5
    26ab0db90d72e28ad0ba1e22ee510510
    

    正如评论中所提到的,这取决于向量的元素是唯一的。如果不是,请在散列之前向元素添加一个随机数。你也可能想要模糊你的输入,特别是如果你有一小组,正如Marius在评论中提到的那样:

    > y = 1:5; y[order(sapply(y, function (n) { digest(n + runif(1), "md5")}))]
    [1] 5 1 3 2 4
    > y = 1:5; y[order(sapply(y, function (n) { digest(n + runif(1), "md5")}))]
    [1] 2 5 4 1 3
    

    假设哈希函数具有恒定时间插入,则它将在O(n)时间内运行。