Algorithm 多个列表的排序组合
将L1、L2、L3视为分别按排序顺序包含n1、n2和n3整数的列表 任务是构造一个排序列表L,这样 L[0] = L1[0] + L2[0] + L3[0] L[i] = L1[i1] + L2[i2] + L3[i3] L[n1 * n2 * n3] = L1[n1] + L2[n2] + L3[n3] L[0]=L1[0]+L2[0]+L3[0] L[i]=L1[i1]+L2[i2]+L3[i3] L[n1*n2*n3]=L1[n1]+L2[n2]+L3[n3] 但是n1,n2,n3都非常大,因此L不能一次构建然后排序 因此,该列表将分阶段构造,这样我们可以显示k个顶部整数,并通过计算第[k+1]个顶部整数来保存要恢复的计算状态Algorithm 多个列表的排序组合,algorithm,sorting,Algorithm,Sorting,将L1、L2、L3视为分别按排序顺序包含n1、n2和n3整数的列表 任务是构造一个排序列表L,这样 L[0] = L1[0] + L2[0] + L3[0] L[i] = L1[i1] + L2[i2] + L3[i3] L[n1 * n2 * n3] = L1[n1] + L2[n2] + L3[n3] L[0]=L1[0]+L2[0]+L3[0] L[i]=L1[i1]+L2[i2]+L3[i3] L[n1*n2*n3]=L1[n1]+L2[n2]+L3[n3] 但是n1,n2,n3都非常大
所有的数据结构和算法都可以用来实现这一目标吗?既然已经有了三个排序列表,您就不能使用一个修改过的列表吗?(我所说的“修改”是指利用您知道每个输入列表已经排序这一事实的东西。)
假设您不能直接使用合并排序,因为您不想在内存中计算整个新合并的排序列表,那么您可以这样做:使用修改后的合并排序,计算第一组合并条目并显示它们,同时维护合并排序中使用的指针。您只需在每个列表中保留您所在的位置,每个列表中一个指向当前位置的指针,然后选择每个块的结束位置。既然您已经有三个已排序的列表,您就不能只使用一个已修改的吗?(我所说的“修改”是指利用您知道每个输入列表已经排序这一事实的东西。)
假设您不能直接使用合并排序,因为您不想在内存中计算整个新合并的排序列表,那么您可以这样做:使用修改后的合并排序,计算第一组合并条目并显示它们,同时维护合并排序中使用的指针。你只需坚持你在每个列表中的位置,一个指针指向每个列表中的当前位置,然后选择你在每个块上留下的位置。好的,这个答案可能会激怒我。但是,由于您只需要算法,最好的解决方案是同时遍历每个列表,并使用最佳元素(在本例中是较低的元素,或者您喜欢的并列元素)构建结果列表。 使用此方法,您有4个位置,每个列表对应一个位置,最后一个点可以指向结果列表中需要插入的位置(或插入的最后一个位置)。有了它,您所需要的唯一结构就是一个列表
在这种情况下,我发现合并排序有问题。您显示的数据可能不是准确的数据(因为您需要对下一部分进行排序,并且可以与当前部分合并)。好的,这个答案可能会激怒我。但是,由于您只需要算法,最好的解决方案是同时遍历每个列表,并使用最佳元素(在本例中是较低的元素,或者您喜欢的并列元素)构建结果列表。 使用此方法,您有4个位置,每个列表对应一个位置,最后一个点可以指向结果列表中需要插入的位置(或插入的最后一个位置)。有了它,您所需要的唯一结构就是一个列表
在这种情况下,我发现合并排序有问题。您显示的数据可能不是精确的数据(因为您需要对下一部分进行排序,并且可以与当前部分合并)。好的,首先是两个维度的示例: 1 2 3 1 2 3 4 5 6 7 8 7 8 9 10
目前我看没有更好的办法了。堆似乎需要大量节点,其大小为n1、n2和n3之和。好的,首先是两个维度的示例: 1 2 3 1 2 3 4 5 6 7 8 7 8 9 10 目前我看没有更好的办法了。堆似乎需要许多节点,其大小为n1、n2和n3之和