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,存在冲突。问题是输入是否能找到它们,一个好的散列函数意味着平均而言,随机输入在四年后不会被接受。