繁体   English   中英

减少列表遍历器的执行时间

[英]Reducing the execution time of a list traverser

我正在完成编码练习。 我的逻辑是有道理的,但在一个大列表中超出了执行限制。 这是问题描述:

Given an array of the numbers of votes given to each of the candidates so far, and an integer k equal to the number of voters who haven't cast their vote yet, find the number of candidates who still have a chance to win the election .

选举的获胜者必须获得严格比任何其他候选人更多的选票。 如果两名或更多候选人获得相同(最大)票数,则假设根本没有赢家。

例子

对于 votes = [2, 3, 5, 2] 和 k = 3,输出应为选举获胜者(投票,k)= 2。

第一位候选人获得 2 票。 即使剩下的3位候选人全部投给他,他仍然只有5票,即与第三位候选人的票数相同,因此不会有获胜者。 如果所有剩余的候选人都投票给他 (3 + 3 = 6 > 5),则第二名候选人可以获胜。 即使剩下的候选人都没有投票给他,第三位候选人也可以获胜。 例如,如果剩下的每个选民都为他的每个对手投了票,他仍然是赢家(因此投票数组将为 [3, 4, 5, 3])。 无论如何,最后一个候选人都无法获胜(与第一个候选人的原因相同)。 因此,只有 2 个候选人可以获胜(第二个和第三个),这就是答案。

这是我的逻辑。 我知道,对于这个问题,我必须遍历列表中的每个元素,以查看添加 k 是否会使它成为列表中的最大值。 但我也觉得我必须检查列表中该值的出现次数以正确识别是否有赢家或有平局:

def electionsWinners(votes, k):
    
    # This variable basically counts the number of possible winners in the list
    counter = 0
    
    for i in votes:
        
        # If all votes go into candidate i and its not a tie:
        if k + i > max(votes) and votes.count(k + i) <= 1:
            # Increment one because we have a potential winner
            counter += 1
        
        # If there are no remaining votes and the biggest value of the list only occures once
        elif k == 0 and votes.count(max(votes)) == 1:
            
            # We only have one winner
            counter = 1
    
    return counter
        

我知道我使用list.max()list.count()增加执行时间。 有哪些方法可以让这段代码运行得更快?

虽然我很感激所有的帮助,但看到人们只发布一个简单的答案还是很令人沮丧的。 这不是家庭作业。 它意味着练习,所以你给我的答案根本没有帮助我。 让我知道如何修复我现有的代码。 谢谢大家。

一些可以优化的东西:

  • max(votes)不依赖于i的值,因此不应在每次循环迭代中对其进行评估。 在循环开始之前评估一次。

  • 表达式k == 0 and votes.count(max(votes)) == 1 它不依赖于循环变量,所以它不应该出现在循环中。 它应该成为决定是否应该执行循环的条件。

  • k + i > max(votes) and votes.count(k + i) <= 1 :如果条件的第一部分为真,则条件的第二部分始终为真。 k + i大于列表中的最大值时,该总和根本不会出现在列表中,即计数为零。

因此,将所有这些放在一起,您可以将其写为:

def electionsWinners(votes, k):
    greatest = max(votes)
    if k == 0:
        if votes.count(greatest) == 1:
            return 1
        else:
            return 0

    counter = 0
    for i in votes:
        if k + i > greatest:
            counter += 1
    
    return counter

您可以通过使用sum而不是“手动” counter += 1来获得一些微小的收益。 同时代码也可以减少一点:

def electionsWinners(votes, k):
    greatest = max(votes)
    if k == 0:
        return int(votes.count(greatest) == 1)

    return sum(1 for i in votes if k + i > greatest)

甚至:

def electionsWinners(votes, k):
    mx = max(votes)
    return sum(1 for i in votes if k + i > mx) if k else int(votes.count(mx) == 1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM