C 将未排序的连续字符串数组高效地写入文件
我有一个包含无序连续数字(范围从0到n)的字符串数组,例如C 将未排序的连续字符串数组高效地写入文件,c,arrays,algorithm,performance,sorting,C,Arrays,Algorithm,Performance,Sorting,我有一个包含无序连续数字(范围从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[orig
[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]
(i=0;i
SorterDarray[originalArray[i]]=originalArray[i]
。。。类似这样的操作(以原始数组的大小创建新数组并在一次运行中填充),然后使用另一个for循环将排序数组的内容写入文件
但是我正在寻找一种更好的方法。假设字符串中的前导数字确实是连续的且不重复的,那么您将不会获得比您在问题中描述的方法或类似方法更好的时间复杂度。它需要与字符串数量成比例的工作空间 相比之下
- 标准的合并排序还需要与字符串数量成比例的工作空间(但如果小心的话,可以得到问题中方法的一半),并且它具有
时间复杂性。或者O(n log n)
- 快速排序到位,平均时间复杂度
;如果您仔细地实现它,那么在最坏的情况下,它只需要O(n logn)
工作空间——递归版本中每个堆栈帧的数量不变,或者非递归版本中容纳那么多元素的堆栈O(logn)
- 就地合并排序需要
工作空间(并且不需要像快速排序那样小心实现),并且平均具有O(logn)
时间复杂度。在大多数情况下,它往往能轻而易举地击败大多数其他的O(n^2)
方法O(n^2)
- 插入排序就地排序,需要
工作空间,但具有O(1)
时间复杂性。它易于理解,易于实现,并且在小输入量的情况下,在实践中速度非常快O(n^2)
还有很多其他的选择,但我认为这些都合理地代表了你的选择。哪一个最适合你的需要取决于你的问题大小的界限,以及你如何权衡空间和速度。如果您的问题规模非常大,并且您负担不起
O(n)
空间开销,那么请仔细考虑快速排序。如果问题的大小一定是小的,但空间守恒是至关重要的,那么考虑插入排序。如果高速是很重要的,并且您可以负担空间开销,那么您最初的方法是非常有吸引力的。假设字符串中的前导数字确实是连续且不重复的,您将不会获得比您在问题中描述的方法更好的时间复杂度,或者类似的东西。它需要与字符串数量成比例的工作空间
相比之下
- 标准的合并排序还需要与字符串数量成比例的工作空间(但如果小心的话,可以得到问题中方法的一半),并且它具有
时间复杂性。或者O(n log n)
- 快速排序到位,平均时间复杂度
;如果您仔细地实现它,那么在最坏的情况下,它只需要O(n logn)
工作空间——递归版本中每个堆栈帧的数量不变,或者非递归版本中容纳那么多元素的堆栈O(logn)
- 就地合并排序需要
工作空间(并且不需要像快速排序那样小心实现),并且平均具有O(logn)
时间复杂度。在大多数情况下,它往往能轻而易举地击败大多数其他的O(n^2)
方法O(n^2)
- 插入排序就地排序,需要
工作空间,但具有O(1)
时间复杂性。它易于理解,易于实现,并且在小输入量的情况下,在实践中速度非常快O(n^2)
还有很多其他的选择,但我认为这些都合理地代表了你的选择。哪一个最适合你的需要取决于你的问题大小的界限,以及你如何权衡空间和速度。如果您的问题规模非常大,并且您负担不起
O(n)
空间开销,那么请仔细考虑快速排序。如果问题的大小一定是小的,但空间守恒是至关重要的,那么考虑插入排序。如果高速是很重要的,并且您可以负担空间开销,那么您最初的方法是非常有吸引力的。假设字符串中的前导数字确实是连续且不重复的,您将不会获得比您在问题中描述的方法更好的时间复杂度,或者类似的东西。它需要与字符串数量成比例的工作空间
相比之下
- 标准的合并排序还需要与字符串数量成比例的工作空间(但如果小心的话,可以得到问题中方法的一半),并且它具有
时间复杂性。或者O(n log n)
- 快速排序到位,平均时间复杂度
;如果您仔细地实现它,那么在最坏的情况下,它只需要O(n logn)
工作空间——递归版本中每个堆栈帧的数量不变,或者非递归版本中容纳那么多元素的堆栈O(logn)
- 就地合并排序需要
工作空间(不需要O(logn)