Python算法教程第二章知识点:计时模块、字典与散哈希表、
admin
2023-01-20 09:24:01
0

微信公众号:geekkr
本文目录:一、计时模块;二、字典与散哈希表;三、图与树的实现;四、成员查询;五、插入对象


一、计时模块(timeit、cProfile)

import timeit
timeit.timeit('x = 1 + 2')

既然学习算法,那么来计算程序所耗费的时间是重要的,但是需要注意:timeit()计时函数会多次运行相关的代码段并求得平均值,以提高计时的精准度,所以,我们需要预防早先的执行操作影响之后代码的执行。举个栗子:若我们执行排序算法,则只有第一次执行代码时是在随机的情况下计时,剩余的数千次运行则都在有序列表的前提下运行,这会导致最终的计时结果偏低。所以,可以尝试使用cProfile模块。

import cProfile
cProfile.run('函数名')

cProfile(或profile)能够将各函数的计时结果打印出来。






二、字典与散哈希表(hashing)
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。可以猜到,哈希表被用于Python中字典(dict)类型与集合(set)类型的实现,且我们对其元素的访问也只是耗费常数级的时间。而Python中的hash()函数则用于获取一个对象(字符串或者数值等)的哈希值。






三、图与树的实现
邻接列表可以视为图结构的表达方式。

# 举个邻接列表的栗子

a, b, c, d, e, f, g, h = range(8)
N = [
    {b, c, d, e, f}, # a节点所指向的节点,如果想要加权则利用字典类型改为{b:2, c:1, …}
    {c, e}, # b …
    {d},
    {e},
    {f},
    {c, g, h},
    {f, h},
    {f, g}
]

b in N[a]
len(N[f])
N[a][b]

同时,邻接矩阵也是图的一种常见的表示方式。

# 举个邻接矩阵的栗子

a, b, c, d, e, f, g, h = range(8)
N = [[0,1,1,1,1,1,0,0],
     [0,0,1,0,1,0,0,0],
     [0,0,0,1,0,0,0,0],
     [0,0,0,0,0,1,0,0],
     [0,0,1,0,0,0,1,1],
     [0,0,0,0,0,1,0,1],
     [0,0,0,0,0,1,1,0]]

N[a][b] # Neighborhood membership, answer is 1
sum(N[f]) # Degree, answer is 3

二叉树的表示方式。

class Tree:
    def __init__(self, left, right):
        self.left = left
        self.right = right

t = Tree(Tree('a', 'b'), Tree('c', 'd'))
t.right.left # answer is 'c'

多路搜索树的表达方式。

class Tree:
    def __init__(self, kids, next=None):
        self.kids = kids
        self.next = next

t = Tree(Tree('a', Tree('b', Tree('c', Tree('d')))))
t.kids.next.next.kids # answer is 'c'







四、成员查询

from random import randrange
L = [randrange(10000) for i in range(1000)]

1 in L # 第一种查询操作

S = set(L)
1 in S # 第二种查询操作

看起来第二种查询操作多此一举,但要知道,在数列中查询成员所耗费的时间是线性级的,而在集合中则是常数级的。






五、插入对象

# 比较两段代码

# 第一段代码
s = ''"
for chunk in string_producer():
    s += chunk

# 第二段代码
chunks = []
for chunk in string_producer():
    chunks.append(chunk)
s = ' '.join(chunks)

相比较之下,第二段代码是更为高效的解决方案。因为在执行第一段代码时,我们每次执行“+=”时都需要新建一个字符串并对其进行转移性质的赋值,以至于其时间复杂度为平方级。同样,在对数列进行相加操作时,使用extend()函数要比sum()函数高效得多。

相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...