【大话数据结构】 部分读书笔记

章节 笔记
1.数据结构绪论
  1. 数据结构:相互之间存在一种或多种特定关系的数据元素集合。
  2. 数据:是描述客观事物的符号,计算机可以操作的对象,符号集合。
  3. 数据元素:是组成数据的、有一定意义的基本单位,也称为记录。如人类中的人。
  4. 数据项:一个数据元素可以由若干个数据项组成。如人的眼、耳。是不可分割的最小单位。
  5. 数据对象:是性质相同的数据元素的集合,是数据的子集。如人都有姓名等相同的数据项。
  6. 逻辑结构:是指数据对象中数据元素之间的相互关系。含集合(无关联)、线性(一对一)、树形(一对多层次关系)、图形(多对多)。
  7. 物理结构:是指数据的逻辑结构在计算机中的存储形式。含顺序存储结构(地址连续的存储单元,逻辑关系物理关系一致 数组)、链式存储结构(存放在任意单元,可连续或不连续,无法反映逻辑关系,需要指针存放数据元素地址)。
  8. 数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总成,如整型。
  9. 抽象数据类型:是指一个数学模型及定义在该模型上的一组操作,如坐标点,马里奥(数据元素间逻辑关系、相关操作等)。
  10. 数据-->数据对象-->数据元素-->数据项。
2.算法
  1. 算法:是解决特定问题求解步骤描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
  2. 算法特性:输入(0或多个)、输出(1个或多个)、有穷性(不会无限循环)、确定性(精准)和可行性(有限次数完成)。
  3. 算法要求:正确性、可读性、健壮性、高效率、低存储。
  4. 算法效率度量方法:事后统计方法(测试数据)、事前分析估算方法(策略、代码质量、输入规模、指令速度)。
  5. 一个程序的运行时间,依赖于算法的好坏和问题的输入规模,用基本操作数量表示成输入规模的函数(如f(n)=n的2次方)。
  6. 函数渐进增长:给定2个函数f(n)[2n^3+1]和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么就说f(n)的增长渐进快于g(n)。
  7. 判断一个算法效率时,函数中的常数和其他次要项常常可以忽略,而应该关注主项(最高阶项的阶数,n^x中的x),随着n增加一个算法会越来越优于或差于另一个算法。
  8. 时间复杂度定义:语句的总执行次数T(n)是关于问题规模n的函数,进而随n变化分析T(n)数量级。算法的时间复杂度,也就是算法的时间量度,记座T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称为时间复杂度。
  9. 推导大O阶方法:1.用1取代所有加法常数;2.修改后的运行次数函数中,只保留最高阶项;3.如果不是1则去除相乘的常数。就能得到大O阶。
  10. 常数阶:不会随着n的变化而发生变化,其时间复杂度总是为O(1)。
  11. 线性阶:分析循环结构中的运行情况,确定某个特定语句或语句集运行的次数,如果只有一个循环且内存为O(1)的复杂度,则此算法时间复杂度为O(n);
  12. 对数阶:O(logn)表示,log为对数标志( )。
  13. 平方阶:比如嵌套循环,如内外循环次数相同O(n^2)、内外循环次数不同O(m*n)。
  14. 常用时间复杂度耗时从小到大排序:O(1)常数阶<O(logn)对数阶<O(n)线性阶<O(n^2)平方阶<O(n^3)立方阶<O(2^n)指数阶<O(n!)阶乘阶<O(n^n)。
  15. 对算法分析有2中方法:1.是计算所有情况的平均值,称为平均时间复杂度;2.是计算最坏情况下的复杂度,称为最坏时间复杂度。一般均指最坏时间复杂度。
  16. 算法空间复杂度:通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n)=O(f(n)),其中n为的规模,f(n)为语句关于n所占存储空间的函数。
3.线性表
  1. 线性表:零个或多个数据元素的有限序列,第一个元素无前驱,最后一个元素无后继,中间元素均知晓前驱和后继。用线性表的个数n(n>=0)定义为线性表的长度,当n=0时称为空表。
  2. 线性表产用操作:初始化空表、判断是否为空、清空、获取指定位置元素、查找元素是否存在、插入、删除、返回元素个数。
  3. 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素,其实位置、最大容量、当前长度。
  4. 数组长度是存放线性表的存储空间的长度,不可变的。线性表的长度是其中元素的个数,可变的。
  5. LOC表示获得存储位置的函数,随机存储结构的性能为O(1)
  6. 线性表的顺序存储结构读、写的复杂度为O(1),插入或删除为O(n)。优点:无需额外空间,快速存取;缺点:插入删除要移动大量元素,当长度变化大时难以确定空间容量,造成存储空间碎片。
  7. 单链表:存储映像包含数据域和指示后继信息位置的指针(或链),n个节点(a下标i的存储映像)链接组成一个链表,即为线性表的链式存储结构,因每个节点中只含一个指针域,所以叫做单链表。对于插入或删除数据频繁的操作,单链表比线性表效率高。
  8. 头指针是链表只想第一个的指针,头节点是放在第一个元素节点之前的节点(可有可无,方便对第一个节点的统一操作)。
  9. 单链表插入删除:从第一个节点开始查找,当到指定位置后,将节点指针执行后继的后继或新增节点地址,然后取值释放内存。
  10. 单链表创建有头插法和尾插法,删除的话要从头开始先将next对象赋值给临时变量后释放对象,然后继续下一个next的删除。
  11. 线性表分为顺序存储结构可随机存取如数组通过下标得到值称为顺序表,链式存储的线性表称为单链表是顺序存取,因为要通过指针域查找下一个元素。
  12. 如果元素个数已知,且插入删除较少应用顺序结构,若频繁增删且个数未知则应用链式结构。
  13. 用数组描述的链表叫做静态链表(是给无法操作指针的高级语言设计的一种实现单链表能力的方法)。优点:插入删除时只需要修改游标;缺点:无随机读取及长度难以确定。
  14. 循环链表:将单链表中终端节点的指针端由空指针改为指向头节点(可有可无头节点),形成一个环称为单循环链表。
  15. 双向链表:在单链表的每个节点中,再设置一个指向其前驱节点的指针域。
4.栈与队列
  1. 栈(stack)是限定仅在表尾进行插入和删除操作的线性表(弹夹),队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表。
  2. 允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),栈又称为后进先出的线性表LIFO结构。插入(push)叫作压栈、入栈,删除(pop)叫作出栈、弹栈。
  3. 栈的顺序存储O(1):顺序栈将下标为0的一端作为栈底,若栈长度为StackSize则top必须小于他,空栈判定条件为top等于-1。
  4. 若一端增加一端减少则可使栈横向结合共享空间。
  5. 栈的链式存储结构O(1):链栈,无需头节点,top=null为空栈,栈顶放在单链表头部,不存在栈满情况。
  6. 如果栈在使用过程中元素变化不可预料最好用链栈,如果变化在可控范围则用顺序栈。
  7. 栈应用:1.递归(斐波那契数列,前面2数和是下一个数);2.四则运算(1.符号在中间的角中缀表达式;2.运算符在2个数之后的角后缀表达式,逆波兰)。

--------------------------------------------------------------------------------------

  1. 队列是一种先进先出的线性表,简称(First in First Out,FIFO),允许插入的一端为队尾,允许删除的为队头。
  2. 队列的顺序存储:顺序存储每次删除一个元素后,后续所有元素均要前移以为,使用2个指针指向队头队尾的话则可能出现假溢出现象。
  3. 队列顺序存储的循环队列:为解决假溢出,把队列的头尾相接的顺序存储结构称为循环队列。
  4. 队列满的条件(front指向队头指针,rear指向下一个可用位置指针):(rear-front+QueueSize)%QueueSize==front,(rear可能比front大,也可能比front小)。
  5. 链队列:队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已。
  6. 在可以确定队列长度最大值的情况下,建议用循环队列,否则用链队列。
  7. 栈:顺序栈(两栈共享空间)、链栈;队列:顺序队列、循环队列、链队列。
5.串
  1. 串:string是由零个或多个字符组成的有限序列,又名叫字符串。
  2. ASCII通过8位二进制表示一个字符共256个字符,能满足英文,Unicode为16位65万字符含各民族文字。
  3. 串中元素仅由一个字符组成,相邻元素具有前驱和后继关系。
  4. 串的顺序存储结构:用一组地址连续的存储单元来存储串中的字符序列,一般用定长数组来定义。
  5. 串的链式存储结构:一个节点存储多个字符,最后一个节点未占满时可用特殊字符补全,总体不如顺序存储。
  6. 朴素的模式匹配算法:子串的定位操作通常称为串的模式匹配。最坏复杂度O((n-m+1)*m)。
  7. KMP(克努特、莫里斯、普拉特)模式匹配算法:根据子串重复度自动跳过已匹配过的主串位置。
6.树
  1. 树:Tree是n(n>=0)个节点的有限集。n=0时称为空树。在任意一棵非空树中:1.有且仅有一个特定的称为根(Root)的节点;2.当n>1时,其余节点可分为m(m>0)个互不相交的有限集T1、T2,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。
9.排序
  1. 排序的稳定性:若排序前r1领先r2,如果排序后r1仍领先r2则为稳定的,反之排序方法是不稳定的。
  2. 内排序:所有记录放在内存中;外排序:内存外多次数据交换。
  3. 冒泡排序、简单选择排序和直接插入排序属于简单算法,而希尔排序、堆排序、归并排序、快速排序为改进算法。
  4. 冒泡排序:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。最小顺序表O(n)最大逆序表O(n^2);
  5. 简单选择排序算法:就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和i(1<=i<=n)个记录交换之。复杂度为O(n^2),性能上优于冒泡算法。
  6. 直接插入排序:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。性能好于冒泡和简单选择排序的性能。
  7. 希尔排序算法:将元素根据一个增量进行分组,对分组进行插入排序,然后合并分组后再进行插入排序。
  8. 堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子的值,称为大顶堆;或每个结点的值都小于或等于其左右孩子节点的值,成为小顶堆。
  9. 归并算法:两两组合成有序表,然后再和其他兄弟表组合,直到合并为一个有序表。
  10. 快速排序:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行继续排序,以达到整个序列有序的目的。
   
   
时间: 2024-10-17 23:27:14

【大话数据结构】 部分读书笔记的相关文章

《大话数据结构》读书笔记——9.9快速排序

1 #include "stdafx.h" 2 #include "stdlib.h" 3 4 int Partition(int *arr,int _low,int _high); 5 void QSort(int *arr,int low,int high); 6 void QuickSort(int *arr,int low,int high); 7 void Swap_a(int *arr,int i,int j); 8 int _tmain(int arg

《大话数据结构》读书笔记——9.4简单选择排序

//c 实现 1 #include "stdafx.h" 2 #include "stdlib.h" 3 4 void swap(int& a,int& b) 5 { 6 int t =a; 7 a = b; 8 b = t; 9 } 10 int _tmain(int argc, _TCHAR* argv[]) 11 { 12 int arr[6] ={0,5,3,4,6,2}; 13 int i,j; 14 for(i=0;i<6;i++)

《大话数据结构》读书笔记——9.3冒泡排序

//C 实现 1 #include "stdafx.h" 2 #include "stdlib.h" 3 4 void swap(int* a,int* b) 5 { 6 int t =*a; 7 *a = *b; 8 *b = t; 9 } 10 int _tmain(int argc, _TCHAR* argv[]) 11 { 12 int arr[6] ={0,5,3,4,6,2}; 13 int i,j; 14 for(i=0;i<6;i++) 15

《大话数据结构》读书笔记——9.5直接插入排序

//C 实现 1 #include "stdafx.h" 2 #include "stdlib.h" 3 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 int arr[6] ={0,5,3,4,6,2}; 7 int i,j; 8 for(i=1;i<6;++i) 9 { 10 if(arr[i]<arr[i-1]) 11 { 12 arr[0] = arr[i]; 13 for(j =i-1;arr[j]&g

《大话数据结构》读书笔记——8.4.1折半查找

//c实现 1 #include "stdafx.h" 2 #include "stdlib.h" 3 4 5 int _tmain(int argc, _TCHAR* argv[]) 6 { 7 int a[10] = {0,1,3,4,6,7,9,11,12,15}; 8 int low,high,mid,key,flag; 9 key = 7;flag = -1; 10 low = 0;high = 10; 11 while(low<high) 12 {

《大话数据结构》读书笔记

P203:树的带权路径长度为树中所有叶子结点的带权路径长度之和. P203:带权路径长度WPL最小的二叉树称做赫夫曼树.

《大话数据结构》学习笔记 排序

排序的严格定义:  假设含有n个记录的序列为{r1,r2,......,rn},对应的关键字分别为{k1,k2......,kn},需确定1,2,......,n的一种排列p1,p2,......,pn,使其相应的关键字 满足Kp1<=Kp2<=......Kpn关系,即使得序列成为一个按关键字有序的序列(rpq,rp2,......rpn),此操作称为排序.  排序的稳定性:内排序与外排序(根据记录是否全部放置在内存中). 根据排序中的主要操作,可以分为插入排序类(直接插入排序->希尔

《大话数据结构》 第一讲.数据结构绪论 (读书笔记)

大话数据结构 导读笔记 第一讲: 一.基本概念和术语 (1)数据元素:是组成数据的.有一定意义的基本单位,在计算机中通常作为整体处理.也被称为记录.   比如,在人类中,什么是数据元素呀?当然是人了. (2)数据项:一个数据元素可以由若干个数据项组成.   比如人这样的数据元素,可以有眼.耳.鼻.嘴.手.脚这些数据项,也可以有姓名.年龄.性别.出生地址.联系电话等数据项,具体有哪些数据项,要视你做的系统来决定. 数据项是数据不可分割的最小单位.在数据结构这门课程中,我们把数据项定义为最小单位,是

《大话设计模式》读书笔记1

通过阅读<大话设计模式>这本书,初步了解了设计模式,以及我以前对设计模式的一些误解. 几条心得如下: 1.设计模式并不只是一种方法,更是一种思想. 2.设计模式和具体的语言没有关系,学习设计模式最重要的目的就是要建立面向对象的思想,尽可能地面向接口编程,高内聚,低耦合,使设计的程序可复用. 3.在进行程序设计时,不要总想着往某个设计模式上套,这是没有真正掌握设计模式思想的表现. 4.学习设计模式,一定要勤学多练. 创建型模式 1.工厂方法模式 使用时机:当在代码中使用new来创建比较复杂的对象

《大话设计模式》读书笔记2

通过UML图对类与类之间的设计,对软件的代码进行封装,重构,这种方法不仅让代码具有极大的扩展性和优秀的可维护性,同时在我看来,这种整理后的代码更加易于理解,正应了那句话,没有规矩不成方圆,完善的规则带来的是秩序的稳定,这种方法我会逐渐的应用于自己的编程中去. 因为这学期开设了<软件设计>这门课程,所以通过上课老师的讲解,课后通过做一些练习,对面向对象的设计原则有了一些了解.  常用的面向对象原则包括7个,这些原则并不是孤立存在的,它们相互依赖相互补充. 单一职责原则(高内聚,低耦合):单一职责