2021-06-25

数据结构笔记

存储结构
邻接矩阵 邻接表 无向o(v+2e)
有向o(v+e)
‌十字链表有向图 邻接多重表无向图(与邻接表区别:同一条边在邻接表中用两个结点表示,而在邻接多重表只有一个结点)
广度优先遍历 邻点(队列) 类似层次遍历
深度优先遍历 (栈) 类似先序遍历
‌无向图 最小生成树
*普里姆算法 距离最近 适合边稠密
克鲁斯卡尔算法 权值递增 适合边稀疏顶点多
‌有向图 最短路径
单源 某结点到其它节点
*迪杰斯特拉算法有权
广度优先求最短路径无权
顶点 弗洛伊德算法
‌图的应用 有向无环图
拓扑排序 关键路径
事件
ve最早从前往后 max
vl最晚从后往前 min
活动
e最早 该弧起点
l最晚 该弧终点-持续时间
l-e=0 即为关键活动


二叉树存储结构 顺序存储(数组) 链式存储(二叉链表)
树的存储结构 双亲表示法 孩子表示法(单链表) 孩子兄弟表示法(即二叉树表示法 即二叉链表)
前中后序遍历(栈) 层次遍历(队列)
线索二叉树 后序线索不方便找后继
‌树 节点总数=每个节点的度数+1
度m第i层结点至多 mˇ(i-1)
‌满二叉树 总结点树 2ˇh-1
‌完全二叉树性质

  1. h=log2(n+1)取上底 h=(log2n) +1取下底
    n0=n2+1
    2.结点=边数+1
    3.第k层至多有 2ˇ(k-1)
    4.总结点至多2ˇh-1 至少2ˇ(h-1)

二叉排序树 左小右大(中序遍历是递增的)类似二分查找 (例题:不能构成一条查找路径的)
折半查找判定树: 分界线要么左要么右

二叉平衡树 左右子树高度差不超过1
左左 右旋 右右 左旋
左右 左旋右旋 右左 右旋左旋
‌哈夫曼树 最优二叉树(所有叶结点的带权路径最短 WPL= 权值*叶到根的路径)
叶子结点数n 非叶子结点数n-1


暴力算法 o(mn)匹配不成功再下一趟
第一趟与主串第一个元素比
第二趟与主串第二个元素比…
‌kmp算法o(m+n) 主串不回溯 子串后退 看主串后缀(包括指针所指)=子串前缀个数
next数组 看子串(前缀=后缀)个数+1
nextval数组 子串与next
不等 直接抄下来next
相等 前一个位置的nextval值

栈队列
栈 顺序栈类似线性表 n个不同元素进栈出栈序列个数1/(n+1)C2n n
‌top=-1表示栈空
若初始top=0表示指向栈顶的下一个位置
‌ 链栈 单链表 带不带头节点实现不同(因为入栈出栈都在表头进行)
‌共享栈 0-(max-1)
0号栈底 0号栈顶 1号栈顶 1号栈底
top0-1栈空 top1=max栈空
0进栈 ++i 1进栈 --i 出栈相反
top1-top0=1 栈满
队 顺序存储
‌循环队列 牺牲一个存储单元表示队空队满
队满 (rear+1)%maxsize=front
入队rear=(rear+1)% max
出队front=(front+1)%max
‌链式存储 带头尾指针的单链表
入队出队类似单链表写法
双端队列
栈的应用 递归 匹配括号 表达式求值
队的应用 广度优先层次遍历 计算机系统应用
特殊矩阵 对称矩阵 上下三角矩阵 三对角矩阵
稀疏矩阵 三元组用数组存储 也可十字链表

线性表
顺序表 数组 随机存储
‌单链表 不论有无头结点,头指针都指向第一个结点
判空:不带头结点 headnull
带头结点 head->next
null
头插法 插在头部 尾插法 (增加一个尾指针)插在尾
双链表
循环单链表
‌循环双链表 判空:带头结点 l->nextl && l->priorl
静态链表 描述线性表的链式结构(借助数组实现)

查找
ASL平均查找长度∑pc,p是查找第i个元素的概率,c是第i个元素需要比较的次数
折半查找O(log2n)
‌折半的判定树是平衡二叉树,相同结点数的折半判定树与完全二叉树的高度相同
折半查找一个不存在的元素,关键字比较次数不会超过树的高度
分块查找: 块内无序,块间有序
ASL=索引查找(b块)+块内查找(s个记录)
顺序查找:(b+1)/2+(s+1)/2
若s=√n, 平均查找长度最小√n +1
对索引表折半查找:log2(b+1)+(s+1)/2

发生碰撞的不同关键字称为同义词
构造散列函数: 除留取余法
H(key)=key%p
p为不大于m(表长)但最接近或等于m的质数
处理冲突:
开放地址法:线性探测法 平方探测法 再散列法 伪随机序列法
拉链法
散列表查找效率取决于:散列函数 处理冲突的方法 装填因子α越大,越容易冲突
(α=表中记录数n/散列表长度m)
堆积问题:同义词或非同义词产生冲突

排序
任意序列基于比较的排序,比较次数至少为log2(n!),取上底
‌插入排序
直接插入O(n²)
折半插入O(n²)
希尔排序 最坏O(n²) 缩小增量排序d1=n/2
d i+1=d i/2,取下底,最后一个增量为1
‌交换排序
冒泡排序O(n²)从后往前两两比较相邻元素,若逆序,则交换它,每趟结束最小元素放到最终序列位置
快速排序O(nlog2n)基于分治法
一趟排序,将待排序列划分两个部分,一部分大于基准,一部分小于基准,每趟结束基准元素放到最终序列位置
‌选择排序
简单选择排序 O(n²)每趟选择最小的元素与第一个元素交换
堆排序O(nlog2n) 大根堆:根节点为最大元素,任一非根结点≤双亲结点
构造堆(完全二叉树):自下往上逐步调整为大根堆,输出堆顶元素后再将剩余元素调整成新堆
归并排序 O(nlog2n)2路归并基于分治
基数排序 O(d(n+r))d趟数 r存储空间
基于关键字各位的大小排序,不基于比较和移动
第一趟用最低位,依次分配和收集

外部排序 考虑i/o次数 通常采用归并排序
增大归并路数(败者树)和减少归并段个数(置换选择排序增大归并段长度)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值