Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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
C# 理解和解决K路合并排序_C#_Java_Algorithm_Data Structures - Fatal编程技术网

C# 理解和解决K路合并排序

C# 理解和解决K路合并排序,c#,java,algorithm,data-structures,C#,Java,Algorithm,Data Structures,我想: 计算k-Way merge sort对从0到N-1的数字随机排列排序所需的比较次数 计算K-Way merge sort所需的数据移动数,以对0到N-1之间的数字随机排列进行排序 我了解双向合并排序如何正确工作,并且非常了解代码。我现在的问题是我不知道如何开始。如何将双向合并排序转换为K向,以便解决上述问题 我在网上搜索过,但找不到任何教程来很好地解释“k-waymerge-sort” 我需要很好的解释我该怎么做,这样我就可以从那里开始自己做 就像我说的,我理解双向排序,那么我该如何

我想:

  • 计算k-Way merge sort对从0到N-1的数字随机排列排序所需的比较次数

  • 计算K-Way merge sort所需的数据移动数,以对0到N-1之间的数字随机排列进行排序

  • 我了解双向合并排序如何正确工作,并且非常了解代码。我现在的问题是我不知道如何开始。如何将双向合并排序转换为K向,以便解决上述问题

    我在网上搜索过,但找不到任何教程来很好地解释“k-waymerge-sort”

    我需要很好的解释我该怎么做,这样我就可以从那里开始自己做

    就像我说的,我理解双向排序,那么我该如何转移到K-Way合并排序呢?如何实现K-way

    编辑 我读了一些帖子 必须使用该二进制堆来实现k路合并。是这样还是有其他方法


    如何将列表划分为K?有什么特别的方法吗?

    你可以把k路合并看作是一系列的双向合并,也就是说,对第一个、第二个和第三个的结果进行双向合并:
    合并(合并(L1、L2、L3)
    等等。更快的方法是将其拆分两次:
    Merge(Merge(L1,L2),Merge(L3,L4))
    。如您所见,对于k-way排序,您将需要某种循环(递归)

    k>2
    时,来自每个输入流的前导元素通常保存在一个minheap结构中。这使得很容易找到n个值的最小值,从堆中弹出该值,并从相应的输入流中插入替换值

    堆对每次插入进行
    O(lg2k)
    比较,因此n个项的k路合并的总工作量是
    n*lg2(k)

    即使您询问了C#和Java,您也可以通过查看用于k-way合并的Python标准库代码来了解如何做到这一点:


    要回答您的另一个问题,没有特殊的方法将您的列表划分为K组。只需将第一个数组中的第一个N/k元素、下一个N/k元素放入下一个数组,以此类推。对每个数组进行排序,然后使用上面提到的堆将它们合并。

    谢谢您的回答。我对我的帖子做了一些编辑。你能帮助我吗?谢谢,没问题。祝您合并好运:-)k路合并不需要二进制堆。您所需要的只是一种快速找到k个项目列表中最小项目的方法,删除该项目,然后将另一个项目放入列表中。通常使用二进制堆,因为它易于实现,并且对于小列表非常有效。但是您可以使用跳过列表或其他一些堆实现,或其他一些优先级队列实现。