arrays - 对具有相同属性的对象进行分组

标签 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) 空间 O(n log n) 时间与 O(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))

关于arrays - 对具有相同属性的对象进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11203633/

相关文章:

algorithm - 可以通过六次比较按中位数划分五个元素吗?

python - 如何返回 Python 数组中目标元素的索引?

python - 复制列表时 '[:]' 和 '[::]' 切片的区别?

python - 如何将数字形式的 python 列表转换为字母?

php - 拉拉维尔 : get data array and loop with For

javascript - 如何在字符串数组中使用正则表达式匹配?

java - 如何仅将 1 个元素传递给 ArrayAdapter 并确保它只显示唯一的项目

algorithm - 一部 10GB 的电影如何在有限的主内存中运行?

list - sencha touch::adding badgeText 到列表项

python - 在python中多次使用数组内部的 'range'