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. 【NX二次开发】Block UI 对象颜色选择器

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  2. [Azure DevOps] 编译时自动修改版本号

    1. 需求 在使用 Pipeline 自动化 CI/CD 流程的过程中,我还还需要自动修改程序集的版本号.这个功能 EdiWang 和LeoLaw 都写文章讲解过做法.不过我的项目基本都是 .Net ...

  3. MySQL 页完全指南——浅入深出页的原理

    之前写了一些关于 MySQL 的 InnoDB 存储引擎的文章,里面好几次都提到了页(Pages)这个概念,但是都只是简要的提了一下.例如之前在聊 InnoDB内存结构 时提到过,但当时的重点是内存架 ...

  4. Linux集群环境下NTP服务器时间同步

    NTP介绍 NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议.它的用途是把计算机的时钟同步到世界协调时UTC(Universal Time ...

  5. WPF使用 INotifyPropertyChanged 实现数据驱动

    如下图,有这么一个常见需求,在修改表单明细的苹果价格时,总价会改变,同时单据总和也随之改变. 按照Winfrom事件驱动的思想来做的话,我们就需要在将UI的修改函数绑定到CellEdit事件中来实现. ...

  6. Mysql优化(出自官方文档) - 第七篇

    Mysql优化(出自官方文档) - 第七篇 目录 Mysql优化(出自官方文档) - 第七篇 Optimizing Data Change Statements 1 Optimizing INSERT ...

  7. 远程连接MySQL错误“plugin caching_sha2_password could not be loaded”的解决办法

    远程连接MySQL错误"plugin caching_sha2_password could not be loaded"的解决办法 问题描述: 今天在阿里云租了一个服务器,当我用 ...

  8. 高性能的Redis之对象底层实现原理详解

    对象 在前面的数个章节里, 我们陆续介绍了 Redis 用到的所有主要数据结构, 比如简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合, 等等. Redis 并没有直接使用这些数据结构来实 ...

  9. Kubernetes自动伸缩pod-HPA

    在运维中,虽然能预先知道负载何时会飙升,或者如果负载的变化是较长时间内逐渐发生的,手动扩容也是可以接受的,但指望靠人工干预来处理突发而不可预测的流量增长,仍然不够理想. 幸运的是,Kubernetes ...

  10. 使用Retrofit上传图片

    Retrofit使用协程发送请求参考文章 :https://www.cnblogs.com/sw-code/p/14451921.html 导入依赖 app的build文件中加入: implement ...