如果数据主要是排序的,我应该使用哪种数据结构?

时间:2013-10-07 11:03:00

标签: c linux sorting data-structures

我有大量的数据(主要是long long类型),这些数据主要是排序的(数据分布在不同的文件中,每个文件数据都是排序的格式)。我需要以排序的方式将此数据转储到文件中。我应该使用哪种数据结构。我正在考虑BST。

我应该使用哪种DS才能获得最佳性能?

由于 Arpit

4 个答案:

答案 0 :(得分:4)

使用任何其他数据结构都无济于事。由于您的大多数数据已经排序,您只需要修复偶然值,使用简单数组提取数据,然后使用插入排序

插入排序在 O(n)中运行,主要用于预分类数据。

但是,这取决于您是否可以在内存中保留足够大的数组,具体取决于您的输入大小。

<强>更新

我对你的“大部分排序”的定义不太清楚。通常它意味着只有少数元素不在精确的排序位置

但是,正如您所说的那样,'数据位于不同的文件中,其中每个文件都单独排序',那么它可能是子函数调用的一个很好的候选者 - 合并< / strong>如合并排序。

请注意,Merge例程会合并两个已排序的数组。如果您说10个文件,其中每个文件都是单独排序的,那么使用Merge例程只需要O(n)。

但是,如果你有一些关闭实例,其中单个文件没有完全排序(单独),你需要使用插入排序。

更新2:

OP说他不能使用数组,因为他无法提前知道记录的数量。使用简单的链接列表是不可能的,因为它永远不会在时间复杂度上与数组竞争(顺序与随机访问时间)。

在评论中指出, 使用链接列表是一个好主意,如果文件是单独排序的,您需要在它们上面运行的只是合并程序

动态分配的数组是最好的,如果他可以在某个时刻预测大小。由于使用了c ++标签(仅删除后者),因此可以很好地调整向量,因为它可以很容易地调整大小。

否则,一个选项可能是堆排序,因为它会首先调用heapify,即构建一个堆(因此它可以动态容纳所需的元素数量)和仍然产生O(nlogn)复杂性。这仍然比尝试使用链接列表更好。

答案 1 :(得分:3)

也许您根本不需要数据结构。

如果文件已经排序,您可以使用合并排序的合并部分,即O(n),或更一般地O(n * log k),其中k是文件数。

答案 2 :(得分:1)

您需要合并多少个文件?

如果只有少数(大约十几个)每个单独的文件都已完全排序,那么您根本不需要构建任何类型的复杂数据结构:只需打开所有输入文件,从每个文件中读取下一条记录,比较,将最小值写入目标,然后从相应的文件中替换该记录。

如果每个文件完全排序,或者一次打开的文件太多,那么是的,您需要在内存中构建一个中间数据结构。我建议使用自平衡树,但由于数据已经大部分已经排序,因此几乎每个插入都会重新平衡。堆可能更适合您的目的。

答案 3 :(得分:0)

最佳排序算法:

插入排序可以有效地用于几乎排序的数据(O(n)时间复杂度)。

最佳数据结构:

如果使用插入排序对链接列表进行排序,则链接列表是数据结构的最佳选择。

使用链接列表的原因:

当元素存储为链表时,可以更快地删除和插入元素。