快速返回订单统计信息的算法名称是什么?

时间:2010-10-26 20:15:57

标签: algorithm

我知道我想要算法做什么,但是我想看看这是否已经在python中实现了,我需要知道算法的名称。

我想在[0,65535]范围内插入一组值到容器中。然后,我想向容器询问任意订单统计信息。插入和查询都应该是对数的。

3 个答案:

答案 0 :(得分:1)

执行此操作的标准方法是使用扩充二进制搜索树。实质上,除了保存存储在树中的密钥集之外,还要保留每个子树中存储的节点的计数。这使您可以有效地计算机统计订单。

由于您正在处理有界整数,因此您可以保留一个存储有65536个值的二叉搜索树,并保留每个子树中存储的元素数量的计数。这会产生O(lg 65536)而不是O(lg n)的运行时间。

答案 1 :(得分:0)

我认为您正在寻找quickselect or median-of-medians算法。

答案 2 :(得分:0)

这是算法。但是,我仍然不知道它叫什么。

#!/usr/bin/env python
"""
This module declares Histogram, a class that maintains a histogram.
It can insert and remove values from a predetermined range, and return order
statistics.  Insert, remove, and query are logarithmic time in the size of the
range.  The space requirement is linear in the size of the range.
"""

import numpy as np

class Histogram:
    def __init__(self, size):
        """Create the data structure that holds elements in the range
           [0, size)."""
        self.__data = np.zeros(size, np.int32)
        self.total = 0

    def size(self):
        return self.__data.shape[0]

    def __find(self, o, a, b):
        if b == a + 1:
            return a
        mid = (b - a) / 2 + a
        if o > self.__data[mid]:
            return self.__find(o - self.__data[mid], mid, b)
        return self.__find(o, a, mid)

    def find(self, o):
        """Return the o'th smallest element in the data structure.  Takes
           O(log(size)) time."""
        return self.__find(o + 1, 0, self.size())

    def __alter(self, x, a, b, delta):
        if b == a + 1:
            self.total += delta
            return
        mid = (b - a) / 2 + a
        if x >= mid:
            self.__alter(x, mid, b, delta)
        else:
            self.__data[mid] += delta
            self.__alter(x, a, mid, delta)

    def insert(self, x):
        """Inserts element x into the data structure in O(log(size)) time."""
        assert(0 <= x < self.size())
        self.__alter(x, 0, self.size(), +1)

    def remove(self, x):
        """Removes element x from the data structure in O(log(size)) time."""
        assert(0 <= x < self.size())
        self.__alter(x, 0, self.size(), -1)

    def display(self):
        print self.__data

def histogram_test():
    size = 100
    total = 100
    h = Histogram(size)
    data = np.random.random_integers(0, size - 1, total)
    for x in data:
        h.insert(x)
    data.sort()
    for i in range(total):
        assert(h.find(i) == data[i])
    assert(h.find(total + 1) == size - 1)
    h.display()