예제 #1
0
def top_k(nums, k):

    if len(nums) <= k:
        return nums

    min_h = MinHeap(nums[:k], k)
    for i in range(k, len(nums)):
        tmp = min_h.get_top()
        if nums[i] > tmp:
            min_h.remove_top()
            min_h.insert(nums[i])

    return min_h.get_data()
예제 #2
0
def top_k(nums,k):
    """
    返回数组的前k大元素
    :param nums:
    :param k:
    :return:
    """
    if len(nums) <= k:
        return nums

    min_h = MinHeap(nums[:k],k)
    for i in range(k,len(nums)):
        tmp = min_h.get_top()
        if nums[i]> tmp:
            min_h.remove_top()
            min_h.insert(nums[i])
    return min_h.get_data()
예제 #3
0
def top_k(nums, k):
    """
    Return the top k elements of the array
    :param nums:
    :param k:
    :return:
    """
    if len(nums) <= k:
        return nums

    min_h = MinHeap(nums[:k], k)
    for i in range(k, len(nums)):
        tmp = min_h.get_top()
        if nums[i] > tmp:
            min_h.remove_top()
            min_h.insert(nums[i])

    return min_h.get_data()
예제 #4
0
파일: top_k.py 프로젝트: ljke/algorithm-py
def get_static_top_k(nums, k):
    """
    get top-K of static data
    :param nums:
    :param k:
    :return:
    """
    if len(nums) <= k:
        return nums
    min_h = MinHeap(nums[:k], k)  # one time use
    min_h.build_heap()
    # compare data with heap top
    for n in range(k, len(nums)):
        tmp = min_h.get_top()
        if nums[n] > tmp:  # if larger, change data
            min_h.remove_top()
            min_h.insert(nums[n])
    return min_h.get_data()
예제 #5
0
def top_k(nums, k):
    """
    返回数组的前k大元素
    :param nums:
    :param k:
    :return:
    """
    if len(nums) <= k:
        return nums
    # 先把nums列表的前k个元素构成小顶堆,大于等于堆顶元素的有k-1个,整个堆为前k大元素
    min_h = MinHeap(nums[:k], k)
    # 其余各个元素 如果大于堆顶元素,则把堆顶元素移除,并添加新元素并从下到上堆化
    for i in range(k, len(nums)):
        tmp = min_h.get_top()
        if nums[i] > tmp:
            min_h.remove_top()
            min_h.insert(nums[i])

    return min_h.get_data()
예제 #6
0
def get_top_k(nums, k):
    """
    返回数组的前k大元素
    :param nums:
    :param k:
    :return:
    """
    if len(nums) < k:
        return nums

    min_heap = MinHeap(nums[:k], k)

    for i in range(k, len(nums)):
        heap_top = min_heap.get_top()
        if nums[i] > heap_top:
            min_heap.remove_top()
            min_heap.insert(nums[i])

    return min_heap.get_data()
예제 #7
0
파일: top_k.py 프로젝트: ljke/algorithm-py
class TopK:
    def __init__(self, k):
        self.k = k
        self.heap = MinHeap(capacity=k)

    def add_data(self, num):
        assert type(num) is int
        if self.heap.get_length() < self.k:
            self.heap.insert(num)
        else:
            tmp = self.heap.get_top()
            if num > tmp:  # if larger, change data
                self.heap.remove_top()
                self.heap.insert(num)

    def get_top_k(self):
        return 'current top-k is :' + str(self.heap.get_data())

    def __repr__(self):
        return self.heap.__repr__()