【问题标题】:How to count occurrences with 'Divide and Conquer' method如何使用“分而治之”方法计算出现次数
【发布时间】:2015-11-03 13:00:06
【问题描述】:

我正在寻找一种算法来计算数组中每个元素的出现次数,使用分治法。

这是一个例子;

Input: 12-3-5-3-12-3
OutPut: (12, 2), (3, 3), (5,1)

谁能至少告诉我从哪里开始? 谢谢

【问题讨论】:

  • 感谢您的回答。但我做到了,我做了很多研究,我很好地理解了分而治之的方法,但仍然......我找不到解决问题的方法。
  • 您可能需要一个全局数据结构的句柄来管理您传递的事件(可能是平衡树)。剩下的是输入数组的递归二分法。我是否遗漏了您的规格中的某些内容?
  • 谢谢,我会努力研究平衡树的想法。我会让你们知道发生了什么。
  • 我不确定使用树是否算作使用分而治之算法。出于这个原因,我不建议堆排序 + 计数。

标签: arrays algorithm find-occurrences


【解决方案1】:

您可以merge sort 数组,然后在排序数组的单次传递中输出值及其计数。

或者,您也可以将输入数组映射到成对数组:(number, 1)。然后像merge sort 那样分而治之,但在合并阶段,您增加相同数字的计数,而不是多次输出。

python中的示例代码

#!python

input = [12, 3, 5, 3, 12, 3];

def count_occurrences(input):
    """ Divide """
    if(len(input) == 0):
        return []
    if(len(input) == 1):
        return [(input[0], 1)]
    left   = count_occurrences(input[:len(input)/2])
    right  = count_occurrences(input[len(input)/2:])

    """ Conquer """
    result = []
    i=0
    j=0
    imax=len(left)
    jmax=len(right)
    while(i<imax and j<jmax):
        if(left[i][0] < right[j][0]):
            result.append(left[i])
            i = i+1
        elif(left[i][0] > right[j][0]):
            result.append(right[j])
            j = j+1
        else:
            result.append((left[i][0], left[i][1]+right[j][1]))
            i = i+1
            j = j+1
    while(i<imax):
        result.append(left[i])
        i = i+1;
    while(j<jmax):
        result.append(right[j])
        j = j+1;

    return result


print (count_occurrences(input))

这将打印:

$ python how-to-count-occurrences-with-divide-and-conquer-method.py
[(3, 3), (5, 1), (12, 2)]                                                       

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 2013-10-30
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 2012-01-01
    • 2023-03-14
    相关资源
    最近更新 更多