Arrays 使用相等属性对对象进行分组

Arrays 使用相等属性对对象进行分组,arrays,algorithm,list,language-agnostic,Arrays,Algorithm,List,Language Agnostic,我有一些任意对象的列表,为了本例的目的,假设它们是(整数,其他东西)对,但它们基本上可以是任何对象: [(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)] 正如你所看到的,

我有一些任意对象的列表,为了本例的目的,假设它们是
(整数,其他东西)
对,但它们基本上可以是任何对象:

[(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)
time与
O(n)
space
O(n log n)
time与
O(1)
space)?

最简单的方法就是使用哈希表。这将导致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(1)
空间,排序在这里是自然的。定义“合理”空间。O(n)合理吗?@amit:是的,合理。编辑了这个问题。@unkulunkulu:我完全知道这一点。但是坚持使用
sort
不足以满足我的好奇心。值得一提的是:
O(n)
使用合理的哈希函数的平均大小写,这可能是合理的assumption@amit:我很可怜那个傻瓜,他用一个整数做了一个糟糕的散列函数;p@leppie:哈希函数有多好并不重要:对于给定数量的bucket,存在冲突。问题是输入是否能找到它们,一个好的散列函数意味着平均而言,随机输入在四年后不会被接受。