【问题标题】:Given an array, what's an efficient way to create an array of arrays where each of these subarrays has indices with equal values from the given array给定一个数组,什么是创建数组数组的有效方法,其中每个子数组的索引与给定数组中的值相等
【发布时间】:2021-11-19 10:20:22
【问题描述】:

假设我有一个大小为 n 的数组,其中包含一些浮点值。我想创建一个包含子数组的新数组,其中每个子数组将具有原始数组中具有相等值的所有元素的索引。因此,例如,给定一个数组 givenArray=[50,20,50,20,40],答案将是 resultArray=[[0,2],[1,3],[4]]。

蛮力方式是对原始数组进行迭代,在每次迭代中,对结果数组进行迭代,将值与每个子数组中的第一个值进行比较;如果等于它,则在此处添加其索引。如果不等于任何子数组的第一个值,则创建一个新子数组并将其索引放在那里。在 python 中的代码是这样的:

resultArray=[]
for i in range(0,len(givenArray)):
    flag=0
    for j in range(0,len(resultArray)):
        if(givenArray[i]==givenArray[resultArray[j][0]]):
            resultArray[j].append(i)
            flag=1
    if(flag==0):
        resultArray.append([i])

此解决方案的复杂度为 O(n^2)。这可以以更好的复杂性完成吗?如何?想法和python代码将不胜感激!提前非常感谢!

阿里

【问题讨论】:

  • 尝试排序。您需要跟踪原始索引。
  • 我如何跟踪原始索引以及它的复杂性以及整个算法的复杂性(例如,假设排序发生在 O(n logn) 中?
  • @Aly 排序为 O(n log(n));除非您犯了某种Shlemiel the painter 错误,否则其他任何事情都将是O(n)。因此总体复杂度将是 O(n log(n))。
  • 有几种方法可以做到这一点。最简单的方法是对一组对 (,value, original_index) 进行排序。

标签: python arrays algorithm data-structures array-algorithms


【解决方案1】:

您可以使用defaultdictenumerate 在线性时间内执行此操作:

from collections import defaultdict

result = defaultdict(list)

for i, n in enumerate(givenArray):
    result[n].append(i)
# {50: [0, 2], 20: [1, 3], 40: [4]}

result = [*result.values()]
# [[0, 2], [1, 3], [4]]

但是请注意,您的示例具有 int 值而不是 floatfloats 不像字典键那样表现良好,因为它们可能会出现舍入或精度错误,尤其是当它们是某种计算的结果时。

【讨论】:

  • 我不知道为什么我总是忘记 defaultdict,它太有用了
【解决方案2】:

@schwobaseggl's answer with a dict 可能是最好的,但为了完整起见,这里是使用groupby 的解决方案。

此解决方案按值的升序返回组。

import operator
import itertools

def group_indices(array):
  sorted_with_indices = sorted(enumerate(array), key=operator.itemgetter(1))
  groups = itertools.groupby(sorted_with_indices, key=operator.itemgetter(1))
  return [[i for i,v in g] for k,g in groups]

print(group_indices([50,20,50,20,40]))
# [[1, 3], [4], [0, 2]]

相关文档:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多