算法卷二:数据结构引入

36 阅读4分钟

今天是学Python算法的第2天,第二卷:数据结构引入。

第一章链接:算法卷一:起行

章六:实例:Python中列表类型不同操作的时间效率

章七:列表和字典操作的时间复杂度

章八:数据结构引入

题引

概念

Python中的数据结构

算法和数据结构的区别

章九:抽象数据类型

概念

尾声

章六:实例:Python中列表类型不同操作的时间效率

from timeit  import Timer
def test1():
    li= []
    for i in range(10000):
        li.append(i)
 
def test2():
    li = []
    for i in range(10000):
        li += [i]    # 缩写和不缩写不一样
 
def test3():
    li = [i for i in range(10000)]
 
def test4():
    li = list(range(10000))
 
def test5():
    li =[]
    for i in range(10000):
        li.extend([i])
 
timer1 =Timer("test1()", "from __main__ import test1")
# timer1.timeit(1000)返回的是花费多长时间,单位是秒
print("append:",timer1.timeit(1000))
 
timer2 =Timer("test2()", "from __main__ import test2")
print("+",timer2.timeit(1000))
 
timer3 =Timer("test3()", "from __main__ import test3")
print("[i for in range]:",timer3.timeit(1000))
 
timer4 =Timer("test4()", "from __main__ import test4")
print("list(range()):",timer4.timeit(1000))
 
timer5 =Timer("test5()", "from __main__ import test5")
print("extend:",timer5.timeit(1000))

运行结果如下

注意:缩写写法:li+ = 1和li = li+[i],不一样。

章七:牛刀小试——列表和字典操作的时间复杂度

list内置操作的时间复杂度

dict内置操作的时间复杂度

章八:初窥门径——数据结构引入

题引

例题:我们如何用Python中的类型来保存一个班的学生信息?(包括姓名,年龄,家乡)

方法:1.列表

列表中加上元组

l1 = [
    ("zhangsan",24,"beijing"),
    ("lisi",24,"beijing"),
    ("wangwu",24,"beijing"),
]

列表中加上字典

l2 = [
    {
       "name":"zhangsan",
        "age":24,
        "hometown":"beijing",
    }
]

如果我要在里面查找是否存在一个叫“zhangsan” 的同学,两者的查找时间复杂度有什么区别呢?

1.对列表

for item in l1:
    if item[0] == "zhangsan":
        print("在")   # 时复杂度为O(n)

2.对字典

if l3["name"] == "zhangsan":
    print("在")  # 时间复杂度为O(1)

所以,字典中查找要比列表中查找的时间复杂度要小。

概念

数据是一个抽象的概念,将其进行分类后得到程序设计语言中的基本类型。如:int,float,char等。数据元素之间不是独立的,存在特定的关系,这些关系便是结构数据。结构指数据对象中数据元素之间的关系。

Python中的数据结构

Python给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做Python的内置数据结构,比如列表,元组,字典,而有些数据组织方式,Python系统里面没有直接定义,需要我们自己去定义实现这些数据的组织方式,这些数据组织方式称为Python的扩展数据结构,比如栈、队列等。

算法和数据结构的区别

数据结构只是静态的描述了数据元素之间的关系。

高效的程序需要在数据结构的基础上设计和选择算法。

**程序 = 数据结构 + 算法(重要)**总结:算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体。

章九:另辟蹊径——抽象数据类型

如果对上述的学生信息查找换个方式实现,很多人会想到——面向对象程序设计,定义学生类,在类里面对学生进行查找,是不是更方便了?

在类里面,我们不仅能对学生进行查找,还能进行添加(转入新同学),删除(转走同学),排列(成绩等排名),修改(修改学生信息)等等。

class Stu(object) :
    def adds(self):
    def pop(self):
    def sort(self):
    def modify(self):

当把数据结构和它所支持的方法放在一起的时候,就产生了一个新的概念。叫做抽象数据类型。

概念

抽象数据类型(ADT):一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上的运算的实现与这些数据类型的运算在程序中引用隔开,使它们相互独立。

最常用的数据****运算有五种:查找,插入,删除,排序,修改。

尾声

数据结构和算法是一名程序开发人员的必备基本功,不是一朝一夕就能练成绝世高手的。冰冻三尺非一日之寒,需要我们平时不断的主动去学习积累。