我正在学习 Big-O 符号,不是为了上课,只是通过自己阅读来学习。我正在阅读 Pythonds 并进行了练习,您的任务是编写一个“非最佳”Python 函数来查找列表中的最小值。该函数应该将每个数字与列表中的每个其他数字进行比较:O(n**2)。
这是我想出的:
def myFindmin(alist):
return[x for x in alist if all(x<=y for y in alist)][0]
Run Code Online (Sandbox Code Playgroud)
这是我正在阅读的书给出的内容:
def findmin(alist):
overallmin=alist[0]
for i in alist:
issmallest=True
for j in alist:
if i>j:
issmallest=False
if issmallest:
overallmin=i
return overallmin
Run Code Online (Sandbox Code Playgroud)
显然,本书版本削减了更多变量等,但是,根据我所了解的,这两个函数的 Big-O 表示法应该是 O(n**2),不是吗?他们都将每个数字与每个其他数字进行比较,这使得 n**2 成为函数的主要部分,是吗?
但是,当我将 myFindmin() 函数与书中的 findmin() 函数与最佳 min() 函数进行比较时,我得到了三个截然不同的结果:
if __name__=='__main__':
for l in range(1000,10001,1000):
thelist=[randrange(100000)for x in range(l)]
print('size: %d'%l)
for f in[findmin,myFindmin,min]:
start=time()
r=f(thelist)
end=time()
print(' function: %s \ttime: %f'%(f.__name__,end-start))
Run Code Online (Sandbox Code Playgroud)
他们甚至不接近:
...
size: …Run Code Online (Sandbox Code Playgroud) 在 Python 2 中,我曾经可以这样做:
>>> var='this is a simple string'
>>> var.encode('base64')
'dGhpcyBpcyBhIHNpbXBsZSBzdHJpbmc=\n'
Run Code Online (Sandbox Code Playgroud)
简单的!不幸的是,这在 Python 3 中不起作用。幸运的是,我能够找到另一种方法在 Python 3 中完成同样的事情:
>>> var='this is a simple string'
>>> import base64
>>> base64.b64encode(var.encode()).decode()
'dGhpcyBpcyBhIHNpbXBsZSBzdHJpbmc='
Run Code Online (Sandbox Code Playgroud)
但这太可怕了!一定有更好的方法!因此,我做了一些挖掘,发现了第二种替代方法来完成曾经是一个超级简单的任务:
>>> var='this is a simple string'
>>> import codecs
>>> codecs.encode(var.encode(),"base64_codec").decode()
'dGhpcyBpcyBhIHNpbXBsZSBzdHJpbmc=\n'
Run Code Online (Sandbox Code Playgroud)
那就更糟了!我不关心后面的换行符!我关心的是,天哪,在 Python 3 中一定有更好的方法来做到这一点,对吧?
我不是在问“为什么”。我想问是否有更好的方法来处理这个简单的情况。