实现Group_by的最佳方式?

时间:2014-05-08 06:37:35

标签: python sql ruby-on-rails algorithm data-structures

在许多函数式语言(python,ruby,...)或SQL中,我们可以直接使用Group_by函数(方法)。我的问题是,如果我想实现这个功能(例如使用Java,C,......,默认情况下没有实现'group_by'),那么最好的方法是什么?以下想法是接近的常见想法,任何想法都比这个好吗?

Input: [ Key, Value ]
{ [ 'A', 1 ], [ 'B', 3 ], [ 'C', 1 ], [ 'A', 2 ], [ 'A', 6 ], [ 'B', 7 ] ... ... ... }

Output:
{ [ 'A', [ 1, 2, 6 ] ], [ 'B', [ 3, 7 ] ], [ 'C' [ 1 ] ], ... ... }

for element in "input": 
        for temp in "input":
            if ( temp.key == element.key )
                Output . getKey( element.key ) . addValue( temp.value );
            end if
        end for
end for

  • 另外,我们假设数组没有排序,我们也假设我们不先排序(首先排序它实际上很容易)。

  • 感谢您指出。我们总是可以先排序。这是一种方法。另外,有时它不需要修改输入,你会做什么? (复制整个输入数据将是花费大量内存的解决方案之一)

  • 感谢您指出哈希表也可以解决这个问题。我相信这是最常见的做法。 O(n)空间复杂度和O(n)运行时间复杂度。


(我只在上面的代码中展示了这个想法,没有考虑所有细节)

感谢您的深思熟虑的回复!!

2 个答案:

答案 0 :(得分:1)

不要将此视为答案,而应视为评论。问题是我无法在评论中发布代码。

如果我的问题是正确的话,一般的方法就是这个(很容易适应几乎所有语言):

蟒:

def group_by(arr):
    arr.sort()
    newarr=[]
    temparr=[]
    k=""
    for i in arr:
        if i[0]!=k:
            if len(temparr)>0:
                newarr.append([k,temparr]) # newarr = newarr + [k, temparr] also works
            k=i[0]
            temparr=[i[1]]
        else:
            temparr.append(i[1])
    newarr.append([k,temparr])
    print(newarr)

答案 1 :(得分:1)

在python中你可以使用字典

input = [('A', 1), ('B', 3), ('C', 1), ('A', 2), ('A', 6), ('B', 7)]

output = {}
for key, value in input:
    if not key in output:
        output[key] = []
    output[key].append(value)