linux中的快速、半精确排序
我正在浏览Linux中的大量文件列表,即“查找”(目录漫游)的输出。我想按文件名对列表进行排序,但我想尽快开始处理这些文件 我不需要排序100%正确linux中的快速、半精确排序,linux,bash,shell,sorting,Linux,Bash,Shell,Sorting,我正在浏览Linux中的大量文件列表,即“查找”(目录漫游)的输出。我想按文件名对列表进行排序,但我想尽快开始处理这些文件 我不需要排序100%正确 如何进行“部分排序”,这可能会在某些时间中断,但会很快输出?这是StackOverflow,而不是SuperUser,因此算法答案应该足够了 尝试实现。但是,不要对完整的姓名列表进行排序,而是执行以下操作 选择一个常数M。它越小,越“关闭”,算法开始打印结果的速度就越“快”。在极限情况下,M等于所有名称的数量,这将是一个精确的排序算法 加载第一个M
如何进行“部分排序”,这可能会在某些时间中断,但会很快输出?这是StackOverflow,而不是SuperUser,因此算法答案应该足够了 尝试实现。但是,不要对完整的姓名列表进行排序,而是执行以下操作
M
。它越小,越“关闭”,算法开始打印结果的速度就越“快”。在极限情况下,M
等于所有名称的数量,这将是一个精确的排序算法M
元素,heapify()
它们siftDown()
M
名称后立即开始打印名称。步骤2是O(M)==O(1)
。步骤3是O(logm)==O(1)
,重复O(N)
次,因此总数是O(N)
此算法将尝试尽可能长时间地保留堆中的大型元素,同时尽可能快地将最低的元素从堆中推出。因此,输出看起来好像几乎已排序
IIRC,该算法的一个变体实际上是
GNU排序
在切换到磁盘上合并排序之前所做的,以尽可能长时间地保持已排序的数据运行,并最小化磁盘上合并的数量。一种方法是在读取-r dir时使用find/path-type d
的输入来馈送循环;查找$dir-type f-maxdepth 1 | sort;完成<(查找/路径-类型d)
。这只是对这个问题的初步思考。我相信,sort
将在数据可用时开始尽可能多的工作。但“部分排序”是行不通的。(从概念上考虑这一点)您可以做的是将数据分割成更小的数据块,并分别对每个数据块进行排序。如果随后再次合并已排序的块,则重新发明了合并排序。事实上,sort
可以帮你做到这一点。这很好,但堆在运行过程中不会被大值阻塞,结果是在扫描结束时,输出会越来越像输入?是否有必要刷新堆并重新启动?@rici:该算法本质上是启发式的,因为没有确切定义您更愿意接受哪种错误。上面的算法是一种变体,试图在整个输出中对某些内容进行排序。似乎您会对GNU排序变量更满意,它的输出正好符合您的建议:几次正确排序的数据运行,而不是一次有错误的长期运行。