有没有一种有效的方法可以在没有 sorting/copying/referencing 原始容器的情况下以特定顺序迭代未排序的容器?
Is there an efficient way to iterate over an unsorted container in a specific order without sorting/copying/referencing the original container?
我想到的是 SortedIterator
,它接受一个 Less
函数,该函数将用于使用所有已知算法对容器进行排序。
暴力实施当然会保留原始元素的副本,或者保留 references/pointers 原始列表中的元素。
有没有一种高效的方法可以在不对列表进行实际排序的情况下按定义明确的顺序进行迭代?我问这个问题是出于对算法的好奇,我希望答案是否定的(或者是 but)。它是出于 C++ 风格的心态而提出的,但实际上是一个非常普遍的语言不可知前提。
如果你想要 O(1) 内存,那么 O(n^2) 复杂度是我们所知道的唯一方法。否则我们可以用同样的方式改进选择排序算法。任何其他排序机制都依赖于能够重组数组的一部分(合并排序依赖于对数组的一部分进行排序,qsort 依赖于基于枢轴拆分数组等等)。
现在,如果您放宽内存限制,您可以做一些更有效率的事情。例如,您可以存储一个堆以包含最小值 x 元素。因此,在通过一次 O(Nlog x) 之后,您将获得迭代器的 x 个元素。对于下一次传递,仅限于大于您目前发出的最后一个元素的元素。您需要完成 N/x 遍才能获得全部。如果 x ==1 则解决方案为 O(N^2)。如果 x == N,则解决方案为 O(Nlog N)(但常数比典型的 qsort 大)。如果数据在磁盘上,那么我会将 x 设置为尽可能多的 ram,减去几 MB 以便能够读取驱动器的大块。
我想到的是 SortedIterator
,它接受一个 Less
函数,该函数将用于使用所有已知算法对容器进行排序。
暴力实施当然会保留原始元素的副本,或者保留 references/pointers 原始列表中的元素。
有没有一种高效的方法可以在不对列表进行实际排序的情况下按定义明确的顺序进行迭代?我问这个问题是出于对算法的好奇,我希望答案是否定的(或者是 but)。它是出于 C++ 风格的心态而提出的,但实际上是一个非常普遍的语言不可知前提。
如果你想要 O(1) 内存,那么 O(n^2) 复杂度是我们所知道的唯一方法。否则我们可以用同样的方式改进选择排序算法。任何其他排序机制都依赖于能够重组数组的一部分(合并排序依赖于对数组的一部分进行排序,qsort 依赖于基于枢轴拆分数组等等)。
现在,如果您放宽内存限制,您可以做一些更有效率的事情。例如,您可以存储一个堆以包含最小值 x 元素。因此,在通过一次 O(Nlog x) 之后,您将获得迭代器的 x 个元素。对于下一次传递,仅限于大于您目前发出的最后一个元素的元素。您需要完成 N/x 遍才能获得全部。如果 x ==1 则解决方案为 O(N^2)。如果 x == N,则解决方案为 O(Nlog N)(但常数比典型的 qsort 大)。如果数据在磁盘上,那么我会将 x 设置为尽可能多的 ram,减去几 MB 以便能够读取驱动器的大块。