【发布时间】:2015-09-08 11:37:56
【问题描述】:
我带着刚刚写的解决方案来到这里,但我绝对找不到更好的方法来尽快对数组进行排序。
我实际上需要算法在不到 1 秒的时间内在包含 100'000 个整数的数组上给我答案。
代码如下:
read N
for (( i=0; i<N; i++ )); do
read arr[i]
done
sorted=($(printf '%s\n' "${arr[@]}"|sort -n))
min=$(( sorted[1]-sorted[0] ))
for (( i=1; i<N-1; i++ )); do
diff=$(( sorted[i+1] - sorted[i] ))
if [ "$diff" -lt "$min" ]; then
min=$diff
fi
done
echo $min
N 是元素的数量,如我所说,在我们的例子中是 100'000。
问题是,在我的数组排序后,我需要遍历它并计算两个整数之间的最小距离:
例如,对于 (3, 5, 8, 9),最小距离为 1(在 8 和 9 之间)。
我是 Bash 的新手,所以我什至不知道这是否是一种有效的方法;
事实上,速度的提升可能来自代码的第二部分,而不是排序部分......
有什么想法吗?
提前致谢,
【问题讨论】:
-
您希望优化您当前的代码还是想要更快的不同代码?
-
第二部分求线性时间内的最小距离。我认为您无法获得更好的(渐近)性能
-
如果您的整数已知是固定集合,则桶排序会更快 O(N)。
-
必须是 bash 吗?由于所有不必要的字符串解析,bash 是您可以为此类内容选择的最糟糕的语言。我敢打赌,通过用编译语言重新编码,你会轻松获得 10 倍的加速。
-
@BrentWashburne 这个问题可能是代码审查的一个好问题,但首先要问一个问题:堆栈溢出是否题外话?这是迁移最重要的要求。 Code Review 不是 Stack Overflow 的迁移目标,因此只有 自定义标志 才能将问题移到那里,如果您认为应该移动它。
标签: arrays algorithm bash sorting integer