【问题标题】:Sort an array of tuples by all elements按所有元素对元组数组进行排序
【发布时间】:2013-03-18 17:15:34
【问题描述】:

我想按所有元素对元组数组进行排序(就像它们在 trie 中一样)。如果输入是 (1,2,5), (1,2,3), (1,1,4), (2,8,9),对应的输出是 (1,1,4), ( 1,2,3), (1,2,5),(2,8,9)。相应的 trie 将是:

    root
   /   \
  1     2
 / \    | 
1   2   8
|  /\   |
4 3  5  9

我正在考虑为元组中的每个位置使用搜索树。还有一种明显的幼稚方式(按第一个位置排序,然后按第二个位置排序,等等)。有人看到更好的方法吗?

【问题讨论】:

  • 很明显,是的。天真,不是

标签: algorithm sorting data-structures binary-search-tree trie


【解决方案1】:

您上面概述的基于 trie 的方法与对元组进行最高有效数字基数排序极为相似。您基本上是根据它们的第一个数字将它们分配到存储桶中,然后根据剩余的数字递归地将存储桶细分为更小的组。您可能需要考虑显式执行 MSD 基数排序而不是构建 trie,因为当数据稀疏时,尝试可能会导致内存效率低下,而 MSD 基数排序具有相当好的内存使用率(特别是如果您隐式实现所有内容)。

在您上面给出的示例中,元组中的所有数字都是个位数。如果是这种情况,您最多可以有 10 × 10 × 10 = 1000 个可能的不同元组,这不是很大。在这种情况下,您可能需要考虑仅使用带有自定义比较器的标准排序算法,因为更优化的排序的好处在这种规模下可能不会那么明显。另一方面,如果您的元组中有更多条目,那么可能值得投资于更聪明的排序,例如 MSD 基数排序。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    基数排序到特里,就像合并排序到二叉树

    【讨论】:

      【解决方案3】:

      如何保持简单并将元组值视为元组的所有元素到某个基数的总和 说 10 那么我们有 (1,2,5) 作为 125 所以时不时地用任何简单的比较排序(如堆排序)对它们进行排序

      【讨论】:

      • 因为元组的数量很容易超过可以在 4(或 8 个字节)上表示的最大 int。当然,一个人可能会变得疯狂到手动实现非常大的数字的加法,并跟踪每一位。很好的练习,为此提供了一个界面。
      猜你喜欢
      • 1970-01-01
      • 2016-02-01
      • 2015-10-18
      • 2013-12-03
      • 1970-01-01
      • 2014-10-19
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多