【发布时间】:2015-07-09 03:56:12
【问题描述】:
好吧,我在 coderbyte 上做一个拼图,下面是拼图的内容:
让函数 SimpleMode(arr) 获取存储在 arr 中的数字数组并返回出现频率最高的数字(模式)。例如:如果 arr 包含 [10, 4, 5, 2, 4],则输出应为 4。如果有多个模式,则返回数组中第一个出现的模式(即 [5, 10, 10, 6 , 5] 应该返回 5,因为它首先出现)。如果没有模式返回-1。数组不会为空。
这是我的程序:
import time
from random import randrange
def SimpleMode(arr):
bestMode=0
numTimes=0
for x in range(len(arr)):
if len(arr)>0:
currentNum=arr[0]
currentMode=0
while currentNum in arr:
currentMode+=1
arr.remove(currentNum)
if currentMode>numTimes:
numTimes=currentMode
bestMode=currentNum
else: break
if numTimes==1: bestMode=-1
return bestMode
start_time = time.time()
numbers = [randrange(1,10) for x in range(0, 1000)]
print(SimpleMode(numbers))
print("--- %s seconds ---" % (time.time() - start_time))
这是别人写的一个更简单的程序:
import time
from random import randrange
def SimpleMode(arr):
best = -1
best_count = 1
for c in arr:
if arr.count(c) > best_count:
best = c
best_count = arr.count(c)
return best
start_time = time.time()
numbers = [randrange(1,10) for x in range(0, 1000)]
print(SimpleMode(numbers))
print("--- %s seconds ---" % (time.time() - start_time))
现在我知道使用我的计时方法取决于我的 CPU 正在做什么以及其他什么,所以这不是最准确的方法,但抛开这一点,我发现我的计算机需要 0.012000 秒来运行我的程序,但运行第二个程序需要 0.025001 秒。
现在我感到困惑。我自己编写的程序花费的时间不到其他程序的一半,该程序使用内置的 python 函数并且只有一个 for 循环,而我的程序在 for 循环中有一个 while 循环。
谁能提供对此的任何见解?
【问题讨论】:
-
使用内置函数并不意味着使用更差的算法会更快。
-
作为第一个猜测,您的循环需要较少的迭代,因为您删除了已经计算过的元素,因此
len(arr) > 0在您遍历整个数组之前可能会为真。第二种算法无论如何都会遍历整个数组,因此根据数组的不同,一种算法可以击败另一种算法。你试过像[1, 2, 3, 4, 5, 6, ...]这样的数组吗? -
@Amber 我在哪里可以找到 count() 使用的算法?
-
@Evert 是的,我使用的原始列表是 numbers = [x for x in range(0, 1000)] 结果是一样的。