Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux中的快速、半精确排序_Linux_Bash_Shell_Sorting - Fatal编程技术网

linux中的快速、半精确排序

linux中的快速、半精确排序,linux,bash,shell,sorting,Linux,Bash,Shell,Sorting,我正在浏览Linux中的大量文件列表,即“查找”(目录漫游)的输出。我想按文件名对列表进行排序,但我想尽快开始处理这些文件 我不需要排序100%正确 如何进行“部分排序”,这可能会在某些时间中断,但会很快输出?这是StackOverflow,而不是SuperUser,因此算法答案应该足够了 尝试实现。但是,不要对完整的姓名列表进行排序,而是执行以下操作 选择一个常数M。它越小,越“关闭”,算法开始打印结果的速度就越“快”。在极限情况下,M等于所有名称的数量,这将是一个精确的排序算法 加载第一个M

我正在浏览Linux中的大量文件列表,即“查找”(目录漫游)的输出。我想按文件名对列表进行排序,但我想尽快开始处理这些文件

我不需要排序100%正确


如何进行“部分排序”,这可能会在某些时间中断,但会很快输出?

这是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排序变量更满意,它的输出正好符合您的建议:几次正确排序的数据运行,而不是一次有错误的长期运行。