使用相同属性对对象进行分组

时间:2012-06-26 08:41:38

标签: arrays algorithm list language-agnostic

我有一些任意对象的列表,为了示例的目的,假设它们是(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)空间或< / strong> O(n log n)时间与O(1)空格)?

2 个答案:

答案 0 :(得分:2)

最简单的方法就是使用哈希表。这将导致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))

答案 1 :(得分:1)

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

不幸的是,我找不到一个很好的答案来解决这个问题的好问题,但是这个问题肯定更为普遍和众所周知,我相信你会证明这个问题的最佳解决方案。