我有一个包含无序连续数字的字符串数组(范围从0到n),例如[7a, 1b, 2c, 0d, 6e, 5f, 3g, 4h]
,我想将这些数字按顺序写入文件。
例如:
0d
1b
2c
3g
4h
5f
6e
7a
字符串长度不一样。
我试图找到一种方法来快速完成并且不占用太多空间。我发现了一种可以在O(n)空间复杂度和O(n)性能方面做到这一点的方法:我创建一个包含n个单元格的数组,并将每个字符串插入到他的单元格编号中。
for (i = 0; i < n; i++)
sortedArray[originalArray[i]] = originalArray[i]
...类似的东西(创建原始大小的新数组并在一次运行中填充它),然后用另一个for循环将已排序数组的内容写入文件。
但我正在寻找一种更好的方法。
答案 0 :(得分:3)
假设字符串中的前导数字确实是连续且不重复的,那么您将无法获得比您在问题中描述的方法更好的时间复杂度,或者沿着这些方向的某些方面。它需要与字符串数量成比例的工作空间。
相比之下,
O(n log n)
;如果你仔细地实现它,那么在最坏的情况下它只需要O(n log n)
工作空间 - 递归版本中每个堆栈帧的常量,或者在非递归版本中容纳许多元素的堆栈。O(log n)
工作空间(并且不像快速排序那样需要尽可能多的关注),并且平均时间复杂度为O(log n)
。在大多数情况下,它很容易超过大多数其他O(n^2)
方法。O(n^2)
工作空间,但时间复杂度O(1)
。对于小输入尺寸,它很容易理解,易于实现,并且实践速度非常快。还有很多其他选择,但我认为这些可以合理地代表您的选择。哪一个最适合您的需求取决于您的问题大小的界限,以及您如何权衡空间与速度。如果您的问题规模可能非常大,并且您无法承担O(n^2)
空间开销,那么请仔细考虑。如果问题规模确定很小,但空间保护至关重要,那么考虑插入排序。如果高速是重要的,你可以承担太空开销,那么你原来的方法非常有吸引力。