这篇文章主要是讲的Python语言的算法,本人还在不断记笔记中,文章也会持续更新,内容比较浅薄,请大家指教另外推荐一个比较好用的记笔记的软件Typora,自己已经使用很久了,感觉不错。。。虽然但是还是有欠缺。
目录
2.2.1链表的基本操作(忽略查找过程插入删除操作时间复杂度都是O(1))
2.队列通常是对历史的回忆,正序(多线程和争夺公平锁,网络爬取url)
第一章 算法概述
1.1 什么是数据结构?
01 数据结构都有哪些组成方式
-
线性结构 最简单的数据结构(数组 链表 栈 队列 哈希表)
-
树 (二叉树 二叉堆)
-
图(多对多的关联关系)
-
跳表 哈希链表 位图.....
02 时间复杂度
设T(n)为程序基本执行次数的函数(程序的相对执行时间函数),n为输入规模,以下是程序中常见的四种执行方式:
例01 渐进时间复杂度
若存在函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(in)是T(n)的同数量级函数。记作T(n)= O(f(n)),称为O(f(n)),0为算法的渐进时间复杂度,简称为时间复杂度。
如何推导出时间复杂度呢?有如下几个原则:
-
如果运行时间是常数量级,则用常数1表示
-
只保留时间函数中的最高阶项。
-
如果最高阶项存在,则省去最高阶项前面的系数。
03 空间复杂度:S(n) = O(f(n))
1.常量空间 O(1)
2.线性空间 O(n)
3.三维空间:当算法分配的空间是一个二维列表集合,并且集合的长度和宽度都与输入规模n成正比时,空间复杂度记作O(n^2)
4.递归空间:函数调用栈(进栈和出栈)其算法的空间复杂度和递归深度成正比
第二章 数据结构基础
2.1 数组的基本操作 (读取 更新 插入 删除)
$$
数组多适合的是读操作多,写操作少的场景 数组是顺序存储
$$
数组多适合的是读操作多,写操作少的场景 数组是顺序存储
数组读取元素和更新元素的时间复杂度都是O(1)
在初始化列表时已经确定了数组的长度,所以要想实现超范围插入则涉及到数组的扩容
在Python中,`[None] * len(self.array)` 表达式创建了一个新的列表,这个列表的长度与 `self.array` 相同,但每个元素都是 `None`。 这里是这个表达式的详细解释: 1. `None` 是Python中的一个特殊常量,表示没有值或空值。它经常用于初始化变量或作为占位符。 2. `[None]` 是一个包含一个 `None` 元素的列表。 3. `len(self.array)` 计算 `self.array` 列表的长度。 4. `[None] * len(self.array)` 通过将 `[None]` 列表复制 `len(self.array)` 次来创建一个新的列表,其中的每个元素都是 `None`。 这个表达式常用于创建一个与另一个列表长度相同但所有元素都是 `None` 的新列表。例如,假设你有一个包含数字的列表,并且你想创建一 个与之相同长度的列表来存储计算结果,但在计算之前你想初始化所有元素为 `None`,那么你就可以使用这种方法。
例01 插入:
'''
# 初始化列表
my_list = [6,1,5,4,2,7,8,9,3]
# 读取列表
print(my_list[2])
'''
# 插入算法
class MyArray:
def __init__(self,capacity):
self.array = [None] * capacity
self.size = 0
def insert(self,index,element):
# 判断访问下标是否超出范围
if index < 0 or index > self.size:
raise Exception("超出数组实际元素范围!")
# 从右向左循环,逐个向右挪动一位
for i in range(self.size - 1,-1,-1):#从大到小遍历一个序列
self.array[i+1] = self.array[i]
# 腾出的位置放置新元素
self.array[index] = element
self.size += 1
def output(self):
for i in range(self.size):
print(self.array[i])
array =