ADT抽象数据类型(ADT:Abstract Data Type):ADT是对数据进行处理的一种逻辑描述,并不涉及如何实现这些处理.
同一ADT可以采用不同的数据结构来实现:1、采用程序设计语言的控制结构和基本数据。2、类型来实现ADT所提供的逻辑接口

一、程序和算法的区别
      1、算法是对问题解决的分步描述;
      2、程序则是采用某种编程语言实现的算法,同一个算法通过不同的程序员采用不同的编程语言,能产生很多程序;

案例程序:

def sumOfN(n):
"""累计求和"""
theSum = 0
for i in range(1,n+1):
theSum = theSum+i
return theSum

 二、计算资源指标

        2.1、那么何为计算资源?
               ❖一种是算法解决问题过程中需要的存储空间或内存;(但存储空间受到问题自身数据规模的变化影响要区分哪些存储空间是问题本身描述所需,哪些是算法占用)
               ❖另一种是算法的执行时间
 

三、Python中有一个time模块,可以获取计算机系统当前时间

         3.1、算法开始前和结束后分别记录系统时间,即可得到运行时间

# 使用timeit模块对函数计时
# 创建一个timer对象,指定需要反复运行的语句 from timeit import Timer t1 = Timer("test1()", "from __main__ import test1")
print("concat %f seconds\n" % (t1.timeit(number=1000))) t2 = Timer("test2()", "from __main__ import test2")
print("append %f seconds\n" % (t2.timeit(number=1000)))

 四、数量级函数 Order of Magnitude,大O表示法

   1、基本操作数量函数T(n)的精确值并不是特别重要,重要的是T(n)中起决定性因素的主导部分用动态的眼光看,就是当问题规模增大的时候,

         T(n)中的一些部分会盖过其它部分的贡献;

   2、数量级函数描述了T(n)中随着n增加而增加速度最快的主导部分称作“大O”表示法,记作O(f(n)),其中f(n)表示T(n)中的主导部分;

                 

算法案例:“变位词”判断问题

所谓“变位词”是指两个词之间存在组成字母的
重新排列关系
如:heart和earth,python和typhon
为了简单起见,假设参与判断的两个词仅由小写
字母构成,而且长度相等 def anagramSolution2(s1, s2):
"""将字符串变成列表并排序,然后逐一对比"""
alist1 = list(s1)
alist2 = list(s2) alist1.sort()
alist2.sort()
pos = 0
matches = True
while pos < len(s1) and matches:
if alist1[pos] == alist2[pos]:
pos = pos + 1
else:
matches = False
return matches
# 使用timeit模块对函数计时
# 创建一个timer对象,指定需要反复运行的语句 from timeit import Timer t1 = Timer("test1()", "from __main__ import test1")
print("concat %f seconds\n" % (t1.timeit(number=1000))) t2 = Timer("test2()", "from __main__ import test2")
print("append %f seconds\n" % (t2.timeit(number=1000)))

五、python数据类型-线性结构:list、dict、stack、queue、Deque、UnorderedList、OrderedList

  让最常用的操作性能最好,牺牲不太常用的操作:80/20准则:80%的功能其使用率只有20%
 
  5.1、什么是线性结构Linear Structure?
        

  5.2、栈Stack,队列Queue,双端队列Deque和列表List
    这些数据集的共同点在于,数据项之间只存在先后的次序关系,都是线性结构
 
 
 
六、 栈stack:一种有次序的数据项集合,在栈中,数据项的加入和移除都仅发生在同一端,Last in First out

           这一端叫栈“顶top”,另一端叫栈“底base”,日常生活中有很多栈的应用:盘子、托盘、书堆等等
           应用场景:
           6.1、浏览器的“后退back”按钮,最先back的是最近访问的网页
      6.2、Word的“Undo”按钮,最先撤销的是最近操作
                 

 stack的实现:

class Stack:
"""简单实现的一个栈"""
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop() #这里的:不同的方法,有不同的操作
# def push(self, item):
# self.items.insert(0,item)
# def pop(self):
# return self.items.pop(0) def peek(self):
return self.items[len(self.items) - 1]
def size(self):
return len(self.items)
 
 
栈的应用一:简单括号匹配((((()))))
class Stack:
"""简单实现的一个栈"""
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop() #这里的
# def push(self, item):
# self.items.insert(0,item)
# def pop(self):
# return self.items.pop(0) def peek(self):
return self.items[len(self.items) - 1]
def size(self):
return len(self.items)
def parChecker(symbolString):
s = Stack()
balanced = True
index = 0
while index < len(symbolString) and balanced:
symbol = symbolString[index]
if symbol == "(":
s.push(symbol)
else:
if s.isEmpty():
balanced = False
else:
s.pop()
index = index + 1
if balanced and s.isEmpty():
return True
else:
return False

print (parChecker('((((()))))'))

通用的写发 包含[{( 

def parChecker(symbolString):
s = Stack()
balanced = True
index = 0
while index < len(symbolString) and balanced:
symbol = symbolString[index]if symbol in "({[":
s.push(symbol)
else:
if s.isEmpty():
balanced = False
else:
top=s.pop()
if not matches(top,symbol):
balanced = False
index = index + 1
print('s', s)
if balanced and s.isEmpty():
return True
else:
return False def matches(open, close):
opens = "[({"
closers = "]})"
return opens.index(open) == closers.index(close)

实用场景
 

 栈的应用二:进制之间的转化

   基本概念:二进制:二进制是计算机原理中最基本的概念,作为组成计算机最基本部件的逻辑门电路,其输入和输出
                      均仅为两种状态:0和1;

                     十进制:人类传统文化中最基本的数值概念,如果没有进制之间的转换,人们跟计算机的交互
                     会相当的困难;

所谓的“进制”,就是用多少个字符来表示整数:十进制是0~9这十个数字字符,二进制是0、1两
个字符
十进制转换为二进制,采用的是“除以2求余数”的算法

 

十进制转化为2进制 案例
def divideBy2(decNumber):
remstack =Stack()
while decNumber>0:
rem=decNumber%2 #求余数
remstack.push(rem)
decNumber = decNumber//2 # 整数部分
binString = ""
while not remstack.isEmpty():
binString=binString+str(remstack.pop())
return binString
print (divideBy2(256))


十进制转换为十六以下任意进制
def baseConverter(decNumber,base):
digits="0123456789ABCDEF"
remstack =Stack()
while decNumber>0:
rem=decNumber%base #余数
remstack.push(rem)
decNumber = decNumber//base # 整数部分
newString = ""
while not remstack.isEmpty():
newString=newString+digits[remstack.pop()]
return newString
print (baseConverter(256,2))

 栈的应用三:表达式应用

def infixToPostfix(infixexpr):
prec = {}
prec["*"] = 3 # 记录操作符优先级
prec["/"] = 3
prec["+"] = 2
prec["-"] = 2
prec["("] = 1
opStack = Stack()
postfixList = []
tokenList = infixexpr.split() # 解析表达式到单词列表
for token in tokenList:
if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "0123456789":
postfixList.append(token)
elif token == "(":
opStack.push(token)
elif token == ")":
topToken = opStack.pop()
while topToken != '(':
postfixList.append(topToken)
topToken = opStack.pop()
else: # 操作符
while (not opStack.isEmpty()) and (prec[opStack.peek()] >= prec[token]):
postfixList.append((opStack.pop()))
opStack.push(token)
while not opStack.isEmpty():
postfixList.append(opStack.pop()) # 操作符
return " ".join(postfixList) # 合成后缀表达式字符串

 七:队列Queue:新加入的数据项必须在数据集末尾等待,而等待时间最长的数据项则是队首;(FIFO:First-in-first-out)先进先出

  应用场景:计算机科学中队列的例子:键盘缓冲❖键盘敲击并不马上显示在屏幕上需要有个队列性质的缓冲区,将尚未显示的敲击
                        字符暂存其中,
      特性:队列的先进先出性质则保证了字符的输入和显示次序一致性。
      Queue():创建一个空队列对象,返回值为Queue对象;
      enqueue(item):将数据项item添加到队尾,无返回值;
      dequeue():从队首移除数据项,返回值为队首数据项,队列被修改;
      isEmpty():测试是否空队列,返回值为布尔值
      size():返回队列中数据项的个数。

class Queue:
def __init__(self):
self.items = [] def isEmpty(self):
return self.items == [] def enqueue(self, item):
# 队列首段加选项
self.items.insert(0, item) def dequeue(self):
# 队列尾端出
return self.items.pop() def size(self):
return len(self.items)


 

enqueue()复杂度为O(n)
dequeue()复杂度为O(1)
def hotPotato(namelist, num):
simqueue = Queue()
for name in namelist:
simqueue.enqueue(name)
while simqueue.size() > 1:
for i in range(num):
simqueue.enqueue(simqueue.dequeue())
simqueue.dequeue()
return simqueue.dequeue()

       

 

五、list:最常用的是:按索引取值和赋值(v =a[i], a[i]= v)、线性结构:【】

四种生成向list里面加数据的方式

def test1():
l = []
for i in range(1000):
          '循环连接列表(+)'
        l = l + [i]

def test2():
l = []
for i in range(1000):
l.append(i) def test3():
'列表推导式'
    l = [i for i in range(1000)]

def test4():
l = list(range(1000))

数据结构与算法(python版)的更多相关文章

  1. 北京大学公开课《数据结构与算法Python版》

    之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...

  2. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

  3. 学习笔记:[算法分析]数据结构与算法Python版[基本的数据结构-上]

    线性结构Linear Structure ❖线性结构是一种有序数据项的集合,其中 每个数据项都有唯一的前驱和后继 除了第一个没有前驱,最后一个没有后继 新的数据项加入到数据集中时,只会加入到原有 某个 ...

  4. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

  5. 数据结构与算法Python版 熟悉哈希表,了解Python字典底层实现

    Hash Table 散列表(hash table)也被称为哈希表,它是一种根据键(key)来存储值(value)的特殊线性结构. 常用于迅速的无序单点查找,其查找速度可达到常数级别的O(1). 散列 ...

  6. 【数据结构与算法Python版学习笔记】算法分析

    什么是算法分析 算法是问题解决的通用的分步的指令的聚合 算法分析主要就是从计算资源的消耗的角度来评判和比较算法. 计算资源指标 存储空间或内存 执行时间 影响算法运行时间的其他因素 分为最好.最差和平 ...

  7. 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫

    定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...

  8. 【数据结构与算法Python版学习笔记】基本数据结构——列表 List,链表实现

    无序表链表 定义 一种数据项按照相对位置存放的数据集 抽象数据类型无序列表 UnorderedList 方法 list() 创建一个新的空列表.它不需要参数,而返回一个空列表. add(item) 将 ...

  9. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  10. 【数据结构与算法Python版学习笔记】树——相关术语、定义、实现方法

    概念 一种基本的"非线性"数据结构--树 根 枝 叶 广泛应用于计算机科学的多个领域 操作系统 图形学 数据库 计算机网络 特征 第一个属性是层次性,即树是按层级构建的,越笼统就越 ...

随机推荐

  1. P2782 友好城市(最长不下降子序列)

    题目描述 有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的$N$个城市.北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同.每对友好城市都向政府申请在河上开辟一条直 ...

  2. ConcurrentSkipListSet - 秒懂

    疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 面试必备 + 面试必备 [博客园总入口 ] 疯狂创客圈 经典图书 : <Sprin ...

  3. google protobuf的原理和思路提炼

    之前其实已经用了5篇文章完整地分析了protobuf的原理.回过头去看,感觉一方面篇幅过大,另一方面过于追求细节和源码,对protobuf的初学者并不十分友好,因此这篇文章将会站在"了解.使 ...

  4. 环境安装——JDK安装

    @ 目录 开发环境-JDK安装 1. 下载地址 2. 安装JDK 3. 配置系统环境 开发环境-JDK安装 无论在我们开始学习Java或者入职第一天安装环境,这个你都是必备滴!下面是下载和安装JDK的 ...

  5. C#WebApi的创建与发布

    VS中新建项目-Web-ASP.NET Web应用程序 然后确定,选择空模版就可以了,勾上Webapi(也可以选择webapi模板,这样生成的文件比较多) 添加好之后Controllers和Model ...

  6. 番外篇:使用nssm工具将ES、Kibana、Logstash或者其他.bat文件部署为Windows后台服务的方法

    使用NSSM工具安装bat文件为Windows服务 nssm是一个可以把bat批处理文件部署为Windows服务的小工具.例如很多.net项目可能还是在Windows服务器上面跑的,但是很多组件只提供 ...

  7. 关于WLS2中Ubuntu启用SSH远程登录功能,基于Xshell登录,支持Root

    背景介绍 虽然WSL2提供了非常便利的访问Ubuntu目录的形式,但是仍然我们需要通过一个工具,比如XSHELL来实现对Ubuntu的SSH登录. 获取并安装Xshell 7 目前Xshell已经更新 ...

  8. 16、编译安装ansible

    16.1.python版本说明: Ansible是一种批量部署工具,现在运维人员用的最多的三种开源集中化管理工具有:puppet,saltstack,ansible,各有各的优缺点, 其中saltst ...

  9. Pygame 入门基本指南

    最近正在利用 Python 制作一个小游戏,但对于 Pygame 不熟悉,故在学习的过程记录相关知识点 Pygame 中文文档下载:Here Pygame第1-1课:入门 什么是Pygame? Pyg ...

  10. 使用CI/CD工具Github Action发布jar到Maven中央仓库

    之前发布开源项目Payment Spring Boot到Maven中央仓库我都是手动执行mvn deploy,在CI/CD大行其道的今天使用这种方式有点"原始".于是我一直在寻求一 ...