首页 > 编程语言 >数据结构与算法之美读书笔记

数据结构与算法之美读书笔记

时间:2023-08-28 20:34:13浏览次数:41  
标签:数据结构 读书笔记 复杂度 之美 算法 查找 low 排序 节点

读书笔记链接   时间复杂度分析

  • 只关注执行次数最多的一段代码
  • 加法法则:总复杂度等于量级最大的那段代码的复杂度
  • 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
  最好、最坏、平均时间复杂度   数组 内存中一块连续的存储空间,有效使用 CPU 的缓存机制,可以很方便的定位元素
  • 在 O(1) 的时间通过下标访问到元素
  • 插入和删除操作比较低效,平均时间复杂度为 O(n)
  • 大小是固定的
  Hash 表 底层可以使用数组存储数据,借助 hash 函数找数据对应的下标   Hash 函数的其他用途
  • 对隐私数据安全加密
  • 唯一标识 和 数据校验(负载均衡)
  • 通过一致性 Hash 算法做分布式存储
  • 数据分片(对数据取 hash,把类似的数据同步到一台机器上)
  链表
  • 增加、删除元素较方便,不是连续存储的数据
  • 单向链表、双向链表、循环链表(解决约瑟夫问题)、双向循环链表
  栈 or 队列 栈是一种操作受限的数据结构,只支持入栈和出栈操作。后进先出是它最大的特点。(特定的数据结构是对特定场景的抽象)   树型结构
  • 二叉树
  • 二叉查找树(左子树<根节点<右子树)
  • 平衡二叉查找树(任意一个节点的左右子树高度相差不能大于 1)
    • 红黑树:近似平衡的二叉查找树,解决了数据更新删除引起的维护成本
  M 阶 B 树:结点最多有 M 个儿子。(概括来说是一个节点可以拥有多于2个子节点的二叉查找树) 要求:
  • 树的根或者是一个树叶儿子数在 2 和 M 之间。
  • 非叶子节点的儿子数在 M/2 到 M 之间。
  • 所有的树叶在相同的深度。
  • 所有元素都保存在叶子节点上。
B+树:(为了支持按照区间查找 和 减少去磁盘取数据)
  • 有 k 个子结点的结点必然有k个关键码(非叶子结点的子树指针与关键字个数相同)。
  • 非叶结点仅具有索引作用,只包含导航信息,不包含实际的值
  • 所有的叶子结点和相连的节点使用双向链表相连,便于区间查找和遍历
  树的遍历方式:根据根节点的遍历时间分为前中后序遍历   堆型结构
  • 堆是一个完全二叉树
  • 堆中的每个节点的值必须大于或者等于每个字节点(大顶堆)
解决问题
  • Top K 问题
  • 优先级队列
    排序 我写的博客 三个基本属性:时间复杂度、空间复杂度、排序算法的稳定性 排序算法的稳定性(排序后相等元素之间原有的先后顺序不变):稳定的排序算法,排序效果可以叠加。(例如按照时间+金额排序)(可以先按照时间排序、再按照金额执行排序)   冒泡排序:只循环比较相邻的数据,最大的数因为比较会下沉,较小的数会逐渐向上冒 插入排序:取未排序区间的元素,在已排序区间找合适的插入位置进行插入 选择排序:和插入排序的思想类似,不同点在于在没有排序的数组元素中进行交换找到最大或最小元素进行排序   查找 我写的博客 二分查找
  • 循环退出条件:low<=high
  • mid 取值:(low+high)/2 因为数据可能比较大会产生溢出 》low+(high- low)/2 〉low+((high-low)>>1) 将除法转化为位运算提高性能
  • low 和 high 需要进行 +- 1更新
  字符串匹配算法 KMP 算法(K(m+n))参考链接
  • 匹配失败看最后一个匹配数值的 next 是什么
  • next 代表可以“跳过匹配”的字符个数
暴力匹配算法(k(nm))   四种常见算法 分治算法:将大的问题拆分成小问题,从子问题中得到原问题的解 回溯算法:遍历所有可选择元素或者数据,如果当前选择不符合问题要求就会产生回溯,即抛弃当前的选择回到上一个状态并进行其他的选择(类似于穷举的解决方式) 穷举算法:枚举法、暴力法,通过搜索所有的解空间得到问题的解 贪心算法:分阶段的工作,在每个阶段做出当前最好的选择,从而希望得到结果是最好或最优的算法 动态规划算法:需要满足(最优子结构、无后效性、重复子问题)
  • 最优子结构:问题的最优解包含子问题的最优解
  • 无后效性:某阶段状态一旦确定,不受之后阶段的决策影响
  • 重读子问题

标签:数据结构,读书笔记,复杂度,之美,算法,查找,low,排序,节点
From: https://www.cnblogs.com/yweihum/p/17663312.html

相关文章

  • Codeforces Round 888 (Div. 3)G. Vlad and the Mountains(数据结构,图论)
    题目链接:https://codeforces.com/contest/1851/problem/G 大致题意: 给出n个点m条边的无向图,每个点有点权h【i】。从点i到点j会消耗h【j】-h【i】的能量,如果小于0,那么就是恢复对应绝对值的能量。 进行q次询问,每次询问包含起点s,终点t,能量e,能量在移动过程中不能小......
  • Codeforces Round 887 (Div. 1)C. Ina of the Mountain(数据结构,反悔贪心)
    题目链接:https://codeforces.com/problemset/problem/1852/C 题意: 给定一个长度为n的序列和正整数k; 每次可以选取任意一个区间,将区间内每个数减1; 如果出现一个数变成0,那么那个数变成k; 问至少操作多少次可以使得每个数变成k; 分析: 将每个数值抽象为对应高度的......
  • 数据结构(数组模拟与STL)
    通过数组模拟栈intstk[N],top;voidinit(){//初始化 top=0;}boolisEmpty(){//判断是否为空 returntop==0;}boolisFull(){ returntop>=MAX-1;}voidpush(intx){if(isFull())//错误(上溢)stk[++top]=x;}intpop(){if......
  • Educational Codeforces Round 152 (Rated for Div. 2)E. Max to the Right of Min(数
    题目链接:https://codeforces.com/problemset/problem/1849/E 大致题意: 长度为n的序列,求有多少个区间满足区间最大值在区间最小值的右边? 解题思路: (此题有使用线段树等其他做法,本处使用的是单调栈做法) 我们先求出每个a【i】的左边的比他小的LMIN,左边比他大的LMAX,右......
  • 「算法与数据结构」梳理6大排序算法 为了offer!
    6种排序如下......
  • 【数据结构机试】树
    存储&访问一般的树vector<int>v[N];voiddfs(intu){for(autox:v[u]){...dfs(x);}}二叉树intL[N],R[N];//表示左右儿子的值分别是多少至于编号,结点\(i\)的左儿子\(2i\),右儿子\(2i+1\)树的遍历一般的数分为先根(先访问根,后访问儿子)、......
  • 「算法与数据结构」梳理6大排序算法 为了offer!
    6种排序如下......
  • GEO数据结构
    概念GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常用命令常见的命令有:GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)GEOADDkeylongitudelatitudememb......
  • 数据结构代码题-线性表
    王道数据结构大题代码线性表#include<stdio.h>#include<stdlib.h>voiddelMin(int*arr,intlen){ if(!len){ printf("数组为空"); return0; } intmin=*arr,minPos=0; for(inti=0;i<len;i++){ if(min>*(arr+i)){ min=*(arr+......
  • mysql 深入学习一 数据结构导图
    索引的本质 B-Tree结构 B+Tree结构 Hash结构  MyISAM存储引擎索引实现 innodb存储引擎实现 innodb引擎生成两个文件,将索引文件和数据文件都放在的.ibd文件下(这就是聚集索引)myisam引擎生成三个文件,将索引和数据分开保存分别在.MYD.MYI文件下(这就是非聚......