找到K个最佳候选人的时间戳

时间:2018-05-27 22:23:49

标签: algorithm min-heap

所以我被问到一个奇怪的倒置K最佳候选人问题。正常的问题如下。

给出一个'投票列表'这是时间戳的元组和下面的候选人:

(111111, Clinton)
(111111, Bush)
...

以最多票数返回前K名候选人。

它是一个典型的问题,解决方案是使用候选的hashmap>在时间戳绑定范围内的投票也构建一个大小为K的最小堆,其中堆的顶部基本上是易于被弹出的候选者K最佳候选人。

最后你返回堆。

但最后我被问到:给出K候选人名单,返回与这些候选人匹配的时间戳作为K最佳候选人。我不确定我是否100%正确地回忆这个问题,因为它必须是这些K候选人中第一次出现的最佳选择,或者我会得到他们的投票结果。

1 个答案:

答案 0 :(得分:0)

如果我理解了所有内容,votes是一个投票元组列表,由投票的候选人和投票的时间戳组成。 currTime是在此之前的时间戳期间所有投票的时间戳。 topCandidatescurrTime投票率最高的候选人。

您的第一个问题是votescurrTime,您需要返回topCandidates。您的第二个问题是votestopCandidates,您应该返回currTime

关注第二个问题,我会制作一个地图,其中键是时间戳,值是当时正在进行的所有投票。此外,我还会创建另一个地图,其中关键是候选人,价值是他们到目前为止的投票数。我将以第一张地图的升序时间戳顺序遍历第一张地图,获得在时间戳上投下的所有投票,并按候选人(关键字)递增第二张地图的值。在浏览下一个时间戳之前,我会在第二张地图中创建一个投票最多的候选人列表。如果该列表与topCandidates匹配,则您遍历的最后一个时间戳为currTime

在python中编写代码:

from collections import Counter, defaultdict
def findCurrTime(votes, topCandidates):
    if not (votes and topCandidates):
        return -1
    votesAtTime = defaultdict(list)
    candidatePoll = Counter()
    k = len(topCandidates)
    for time, candidate in votes: # votes = [(time0, candidate0), ...]
        votesAtTime[time].append(candidate)
    for ts in votesAtTime:
        candidatePoll += Counter(voteAtTime[ts])
        if list(map(lambda pair: pair[0],candidatePoll.most_common(k))) == topCandidates:
            return ts
    # if topCandidates cannot be created from these votes:
    return -1

我做了一些假设(你希望问你的面试官)。我假设topCandidates的顺序对Counter.most_common处理的事项很重要,尽管它不会处理具有投票数的候选人。

时间复杂度为O(t * n * log(k)),其中t是时间戳的数量,n是投票数,k是topCandidates的大小。这是因为Counter.most_common looks to be O(n*log(k)),它可以运行t次。肯定有更有效的答案。