algorithm - 给定一个实数列表。什么是将它们分组在一起以使组中的最大值和最小值小于 5 的好算法?

标签 algorithm sorting computer-science

假设我有一个这样的数字列表:1,100,2,10,3,14,55,101,102,58 我想要一个算法将它们组合在一起,这样

  • 组数尽量少

  • 一组内最大数与最小数之差应小于5。

其实第一个条件只是为了让问题更严谨;在我的应用程序中,数字相对分开,因此至少对于一个人来说很容易看到该组应该是什么样子。例如。在上面的例子中,它显然应该是 { [1,2,3],[10,14],[55,58],[100,101,102]}

有没有比双for循环更好的算法来解决这个问题?

谢谢!

最佳答案

我觉得你可以先把所有的数排序,然后在线性时间内贪婪地分组。假设您在名为 arr 的数组中有数字,最大和最小元素之间的差异(即您在问题陈述中提到的 5)称为 diff 并且数字数组的索引,从0开始。

n = len(arr)
sortedArr = sorted(arr)
groupStart = 0
groupsFound = [[sortedArr[0]]]
numGroups = 1
for i in range(1, n):
    if sortedArr[i] - sortedArr[groupStart] >= diff:
        groupStart = i
        numGroups += 1
        groupsFound.append([ sortedArr[i] ])
    else:
        groupsFound[numGroups-1].append(sortedArr[i])

我认为贪婪的方法是最优的,在这种情况下,因为每个数字都必须在一些组中。对于一个大小为n的数组,排序的复杂度为O(nlogn),分组的复杂度为O(n),使得上面代码的整体复杂度为O(nlogn)

关于algorithm - 给定一个实数列表。什么是将它们分组在一起以使组中的最大值和最小值小于 5 的好算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35862469/

相关文章:

java - 适合内存的顺序数据的 QuickSort 和 MergeSort 性能与磁盘上访问顺序数据的速度比较慢

javascript - *在排序时*在数组中插入新的随机数

javascript - 如何从数组中删除某些元素到新数组中,并将不重复的元素保留在具有相同数组长度的相同位置

algorithm - 计算一组结果概率的有效方法?

Javascript Sort() 数组按数字顺序排列

algorithm - 克鲁斯卡尔的算法 : Update MST when an edge becomes mandatory

c++ - HSV (0 .. 255) 到 RGB (0 .. 255)

algorithm - 如果我们使用链表实现桶,桶排序的复杂度是 O(n+k) 是多少?

computer-science - 计算机科学在过去 5 年的进步

functional-programming - 对于定点组合器 Y,\x.f(xx) 是什么