Algorithm 如何有效地对分区数组进行排序?

Algorithm 如何有效地对分区数组进行排序?,algorithm,matlab,sorting,Algorithm,Matlab,Sorting,我有K个文件。我叫它们X1,X2XK 每个文件都是一个双倍数组。 这意味着我实际上有一个nkx1数组,在K数组中分区。让我们把这个大数组称为X 我需要排序X,无法将所有数据加载到内存中。执行此排序并将结果保存在单独文件中的有效算法是什么 如果我只想对H元素进行排序,我知道(当然不确定是否有效)如何进行排序: 排序X1并将其另存为sX1 A=sX1(1:H,1)//在Matlab中 排序X2和A 对其他文件重复步骤1、2和3 但是由于内存问题,H不能很大 更新 这个问题与这个问题不同,尽管它有所帮

我有K个文件。我叫它们X1X2XK
每个文件都是一个双倍数组。
这意味着我实际上有一个nkx1数组,在K数组中分区。让我们把这个大数组称为X

我需要排序X,无法将所有数据加载到内存中。执行此排序并将结果保存在单独文件中的有效算法是什么

如果我只想对H元素进行排序,我知道(当然不确定是否有效)如何进行排序:

  • 排序X1并将其另存为sX1
  • A=sX1(1:H,1)//在Matlab中
  • 排序X2和A
  • 对其他文件重复步骤1、2和3
  • 但是由于内存问题,H不能很大

    更新
    这个问题与这个问题不同,尽管它有所帮助。如果我想使用该问题答案或MikeB的答案,那么也应该回答: 我应该将K个文件合并成一个文件,然后使用外部排序算法吗。如果是,如何进行


    谢谢。

    您尝试的是外部排序。每个分区都会自行排序。然后,您必须合并所有分区以构建最终的排序列表。如果只查找前几项,可以提前退出合并

    对于外部合并,似乎有一些现有的解决方案。以下是指向mathworks文件交换站点上的一个链接:

    更新:我链接的代码显示了它是如何在matlab中完成的。具体来说,这里的代码:获取需要合并的文件列表,并最终将它们合并到一个文件中

    在最初的问题陈述中,您说您有K个文件,从X1到XK。外部排序首先对这些文件进行排序,然后将它们合并到一个文件中。一个简单的实现会有如下伪代码:

    // external merge-sort algorithm
    For each file F in (X1 ... XK)
        Read file F into memory array R
        Sort R
        Overwrite file F with sorted data from R
        Clear array R in memory
    For N = K-1 down to 1
        in-order merge file XN+1 and XN into file X'
        erase file XN+1 and XN
        rename file X' as XN
    
    您应该看到,第一阶段是排序。我们将每个文件读入内存,对其进行排序,然后将其写回。这是I/O,但效率很高;希望我们使用尽可能多的内存,以便尽可能多地在内存中排序。在第一个循环的末尾,我们有K个文件,每个文件都在自己的值域中排序

    给定K个排序文件,我们的下一步是合并它们。合并两个文件不使用任何内存,但会产生大量I/O。合并两个文件如下所示,给定两个名为L和R的文件,我们可以将它们合并为O:

    // merge two files algorithm
    Get value LV from L
    Get value RV from R
    While L is not EOF AND R is not EOF
        if ( LV <= RV )
            write LV into O
            get value LV from L
        else 
            write RV into O
            get value RV from R
    While L is not EOF
        get LV from L
        write LV into O
    While R is not EOF
        get RV from R
        write RV into O
    
    //合并两个文件算法
    从L获取值LV
    从R获取值RV
    而L不是EOF,R不是EOF
    
    如果(LV+1,但当只查找top-k项时,使用堆的部分排序效率要高得多(单次传递,O(n lg k)时间,O(k)内存使用)。部分排序仍然必须是外部的,因为我们知道O(k)不适合内存。有一些选择算法在O(n)中运行,例如中位数。它们有一些约束条件,可能适用于(也可能不适用于)Ron的场景。@MikeB,谢谢你的回答。这对我帮助很大,但没有解决我的问题。请看更新内容好吗?我已经更新了我的答案,提供了有关合并的更多信息。