假设我有一个整数向量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
答案 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)
以下是我之前评论的解决方案草图:
sort()
。大多数哈希函数都是通过输出中的单个更改来彻底改变的,因此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)
时间内运行。