【问题标题】:Grouping objects with an equal property将具有相同属性的对象分组
【发布时间】:2012-06-27 13:15:36
【问题描述】:

我有一些任意对象的列表,出于示例的目的,假设它们是 (integer, something-else) 对,但它们本质上可能是任何对象:

[(5, a), (3, c), (2, f), (3, a), (4, c), (1, d), (5, b), (5, d)]

我想根据它们的属性之一对这些对象进行分组,以便共享所述属性的相同值的元素在结果列表中相邻。例如,上面的列表按整数值分组:

[(3, a), (3, c), (1, d), (4, c), (2, f), (5, b), (5, a), (5, d)]

如您所见,不需要任何顺序,操作也不需要稳定。


天真的方法是对列表进行排序。这具有众所周知、经过充分测试和足够快的优点。

不过,我很好奇:是否有一种不涉及排序的算法,同时在复杂性方面具有竞争力(O(n) 时间与O(n) 空间 @ 987654326@时间与O(1)空间)?

【问题讨论】:

  • O(1)空格的排序算法,这里排序很自然。
  • 定义“合理”的空间。 O(n) 合理吗?
  • @amit:是的,是的。编辑了问题。
  • @unkulunkulu:我完全清楚这一点。但坚持sort 并不足以满足我的好奇心。

标签: arrays algorithm list language-agnostic


【解决方案1】:

最简单的方法就是使用哈希表。这将导致 O(n) 操作。

伪代码:

foreach (e in list)
  hashtable[e.key].append(e.value)

; then 'flatten'

var out = new list

foreach (kv in hashtable)
  foreach (v in kv.values)
    out.add( new kv(kv.key, v))

【讨论】:

  • 值得一提:O(n) 平均情况 具有合理的哈希函数,这可能是一个合理的假设
  • @amit:我很同情那个基于整数的哈希函数很差的傻瓜;p
  • @leppie:散列函数有多好并不重要:对于给定数量的桶,会有冲突。问题是输入是否能找到它们,一个好的散列函数意味着平均随机输入不能。
【解决方案2】:

考虑从整数数组中删除非唯一条目的问题。这个问题可以通过你的问题的解决方案来解决(在线性时间和恒定空间中),所以你的问题不能比这更简单。

很遗憾,我找不到一个可以很好回答这个问题的好问题,但这个问题肯定更普遍,更知名,我相信你会证明这个问题的最佳解决方案。

【讨论】:

  • 四年后接受。
猜你喜欢
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-03
  • 2013-10-14
  • 1970-01-01
相关资源
最近更新 更多