湖南大学(866)数据结构笔记
数据结构详细笔记

数据结构详细笔记数据结构是计算机科学中非常重要的一个概念,它可以帮助我们更有效地组织和管理数据。
在本文中,我将详细介绍各种常见的数据结构及其特点和应用场景。
一、线性表线性表是最简单也是最常见的数据结构之一。
它是由一系列具有相同类型的元素组成的序列,其中每个元素都有一个前驱元素和一个后继元素,除了第一个元素没有前驱元素,最后一个元素没有后继元素。
常见的线性表有数组、链表和栈。
1. 数组数组是一种在内存中连续存储的数据结构,可以通过下标来访问其中的元素。
它的优点是访问速度快,缺点是插入和删除操作比较慢。
2. 链表链表是通过指针将一组零散的内存块连接起来形成的数据结构,它的节点可以不连续存储。
链表的优点是插入和删除操作比较快,缺点是访问速度相对较慢。
3. 栈栈是一种后进先出(LIFO)的线性表,它只允许在表的一端进行插入和删除操作。
常见的应用场景有函数调用、括号匹配等。
二、队列队列是一种先进先出(FIFO)的线性表,类似于现实生活中的排队。
它有两个指针,分别指向队头和队尾。
常见的队列有普通队列、双端队列和优先队列。
1. 普通队列普通队列是最基本的队列形式,只能在队头删除元素,在队尾插入元素。
常见的应用场景有任务调度、消息队列等。
2. 双端队列双端队列是允许从两端插入和删除元素的队列。
它可以作为栈和队列的结合体,常见的应用场景有回文判断、迷宫问题等。
3. 优先队列优先队列是一种按照元素优先级进行插入和删除操作的队列。
常见的应用场景有任务调度、图像压缩等。
三、树树是一种非线性的数据结构,它由若干个具有层次关系的节点组成。
树的每个节点可以有多个子节点,但每个子节点只能有一个父节点。
常见的树有二叉树、二叉搜索树和平衡树。
1. 二叉树二叉树是每个节点最多有两个子节点的树结构。
它的遍历方式有前序遍历、中序遍历和后序遍历。
常见的应用场景有表达式计算、文件系统等。
2. 二叉搜索树二叉搜索树是一种特殊的二叉树,它的左子树的所有节点都小于根节点,右子树的所有节点都大于根节点。
专业课数据结构笔记

专业课数据结构笔记(页面pXX对应于严版《数据结构》)第一章绪论1.1 什么是数据结构……p41.1.1数据结构的定义数据:数据元素:数据结构:指数据以及相互之间的联系,包括:(1)数据的逻辑结构。
(2)数据的存储结构(物理结构)。
(3)施加在该数据上的运算。
同样的运算,不同的存储结构中,其实现的过程是不同的。
同样的一个逻辑结构对应的物理结构可以不同。
1.1.2 逻辑结构类型(1)线性结构(2)非线性结构:1)树形结构2)图形结构1.1.3 存储结构类型(1)顺序存储方法(2)链式存储方法(3)索引存储方法(4)散列存储方法1.2 算法及其描述……p131.2.1 什么是算法算法定义:五个特点:eg. 考虑下面两段描述(1)void exam1() {n=2;while(n%2==0)n=n+2;printf(“%d\n”,n);}(2)void exam2() {y=0;x=5/y;printf(“%d,%d”,x,y);}违背了哪些特点:答:算法(1)违反了有穷性,算法(2)违反了可行性。
1.2.2算法描述要求采用C/C++描述。
注意C++中的引用&。
eg1. int a=4;int &b=a;此时两个变量同步改变eg2. void swap(int& x, int& y){ int temp=x;x=y;y=temp;}执行swap(a,b)后,a、b值发生交换如果将函数声明改成void swap1(int x, int y),则swap1(a,b)不交换a、b的值。
在C语言中为了支持引用类型,采用指针方式回传行参的值:void swap(int *x, int *y)1.3 算法分析……p141.3.1时间复杂度定义:指其基本运算在算法中重复执行的次数。
算法中基本运算次数T(n)是问题规模n的某个函数f(n),记作:T(n)=O(f(n))f(n)是正常数n的一个函数,存在正常数M使n>=n0时,|T(n)|<=M*|f(n)|eg1. T(n)=3n2-5n+10000=O(n2)eg2. 求两n阶方阵和C=A+B,分析时间复杂度void MatrixAdd(int n, int A[MAX][MAX], int B[MAX][MAX], int C[MAX][MAX]){ int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++)C[i][j]=A[i][j]+B[i][j];}T(n)=O(n2) (不会输公式,省去了步骤)eg3. 分析时间复杂度int fun(int n) {int i,j,k,s;s=0;for(i=0;i<=n;i++)for(j=0;j<=i;j++)for(k=0;k<=j;k++)s++;}T(n)=O(n3)eg4. 包含递归的情况(考研中最难的算法分析题,武大应该不会出)void fun(int a[], int n, int k) //a中有n个元素{ int i;if(k==n-1) {for(i=0;i<n;i++)printf(“%d\n”,a[i]);else {for(i=k;i<n;i++)a[i]=a[i]+i*i;fun(a,n,k+1)l}}fun(a,n,0)调度,求时间复杂度。
数据结构学习笔记(线性表)

数据结构学习笔记(线性表) 1.基础概念: *数据((数据对象(数据元素(数据项)))------包含关系。
*数据结构是互相之间存在⼀种或多种特定关系的数据元素的集合。
*逻辑结构:集合机构,线性结构,树形结构,图形结构。
*物理结构:顺序储存结果、链接储存结构。
2.算法效率问题: *判断⼀个算法的效率时,函数中的常熟和其他次要项常常可以忽略,⽽更应该关注主项(最⾼次项)的阶数。
最⾼次项的指数⼤的,函数随着n的增长,结果也会变得增长特别快。
*常数项:不管这个常数是多少,我们都计作O(1)。
*单纯的分⽀结构(不包含在循环结构中),其时间复杂度也是O(1)。
*推导⼤O阶(时间复杂度)⽅法: a.⽤常数1取代运⾏时间中的所有加法常数。
b.在修改后运⾏次数函数中,只保留最⾼阶项。
c.如果最⾼阶项存在且不是1,则去除与这个项相乘的常熟,得到的结果就是⼤O阶。
*对算法的分析,⼀般在没有特殊说明的情况下,都是指最坏时间复杂度。
*当不⽤限定词地使⽤“复杂度”时,通常都是指时间复杂度。
*算法的定义:算法是解决特定问题求解步骤的描述,在计算机中为指令的有限程序列,⽽且每条指令表⽰⼀个或者多个操作。
*算法的特性:有穷性、确定性、可⾏性、输⼊、输出。
*算法的设计的要求:正确性、可读性、健壮性、⾼效率和低储存量的要求。
*算法的度量⽅法:事后统计⽅法(不科学、不准确)、事后分析估算⽅法。
3.线性表 线性表:零个或多个数据元素的有限序列。
⾸先它是⼀个序列,元素之间是有顺序的,其次,线性表是有限的。
在任意时刻,线性表的长度应该⼩于等于数组的长度。
⼀些操作: ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,......,an},每个元素的类型均为DataType。
其中,除第⼀个元素a1外,每⼀个元素有且只有⼀个直接前驱元素,除了最后⼀ 个元素an外,每⼀个元素有且只有⼀个直接后置元素。
数据结构课堂笔记di

则找不出谁是前驱谁是后继
插入a1:*p=a1;改为:p->date=a1;指针p指向对象date=a1,该对象是一个结构体,指向结构体里a1那部分
删除a1并把存储空间解放:free(p);
动态存储结构
地址=malloc(大小);字节
free(p);
区别:数组:编译时确定(静态)
链表:编译时确定(动态)<原本不存在>
{
q<=(NODE*)malloc(sizeof(NODE));
q->data<=y;
q->next<=NULL;
if(head=NULL)
head<=q;
else if(head->date=x)
{
q->next<=head;
head<=q;
}
else
{
r<=head;
p<=head->next;
default:语句序列n+1;
}
(6)循环语句有:
for语句for(赋初值表达式序列;条件;修改表达式序列)语句;
while语句while(条件)语句;
do-while语句do{
语句序列;
}while(条件);
(7)结束语句有
函数结束语句return表达式;
return;
case结束语句break;
switch(ct)
{
case">":
attach(PC,Pa->coof,Pa->exp);
Pa<=Pa->next;
break;
case"=":
数据结构读书笔记

数据结构读书笔记在学习计算机科学的过程中,数据结构无疑是一座重要的基石。
它不仅影响着程序的运行效率,还决定着我们解决问题的思路和方法。
通过对数据结构相关书籍的研读,我有了许多深刻的体会和收获。
数据结构,简单来说,就是数据的组织方式和存储方式。
它就像是一个仓库,我们需要根据货物的特点和使用需求,选择最合适的存放方式,以便能够快速、准确地找到和处理它们。
在常见的数据结构中,数组是我们最先接触到的。
数组是一种线性的数据结构,它将相同类型的元素按照顺序存储在连续的内存空间中。
就好像是一排整齐排列的盒子,每个盒子里都装着相同类型的物品。
使用数组的好处是访问元素的速度非常快,因为我们可以通过索引直接定位到对应的元素。
但它也有缺点,比如在插入和删除元素时,如果涉及到中间位置,就需要移动大量的元素,这会导致效率低下。
链表则是另一种常见的数据结构,它与数组有着很大的不同。
链表中的元素不是连续存储的,每个元素除了存储自身的数据外,还包含一个指向下一个元素的指针。
这就像是把一个个珠子用线串起来,我们通过线来找到下一个珠子。
链表在插入和删除元素时非常方便,只需要修改相邻元素的指针即可,不需要移动大量的数据。
但链表的缺点是访问特定位置的元素时,需要从头开始逐个遍历,效率相对较低。
栈和队列是两种特殊的线性数据结构。
栈就像是一个只能从一端进出的容器,遵循“后进先出”的原则。
想象一下往一个桶里放东西,最后放进去的会最先被拿出来。
而队列则像是排队买票的人群,遵循“先进先出”的原则,先排队的人先得到服务。
栈和队列在很多算法和程序中都有广泛的应用,比如表达式求值、页面的回退和前进、任务的调度等。
除了线性数据结构,树形结构也是非常重要的一类数据结构。
二叉树是树形结构中最基本也是最重要的一种。
它每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉搜索树是一种特殊的二叉树,它的左子树中的节点值都小于根节点的值,右子树中的节点值都大于根节点的值。
数据结构与算法笔记

数据结构与算法笔记数据结构与算法笔记一、数据结构数据结构是计算机程序设计中非常重要的一个概念,它是指一组数据的组织方式。
常见的数据结构有链表、栈、队列、树、图等。
1.链表链表是一种动态数据结构,它由节点组成,每个节点包含数据和指向下一个节点的引用。
链表可以分为单向链表、双向链表和循环链表。
2.栈栈是一种先进后出的数据结构,它只支持在栈顶进行插入、删除和读取操作。
栈可以用数组或链表实现。
3.队列队列是一种先进先出的数据结构,它支持在队尾插入元素,在队头删除元素和对头元素进行读取操作。
队列可以用数组或链表实现。
4.树树是一种非线性数据结构,它由节点和边组成。
树的节点包含数据和指向它的子节点或父节点的引用。
常见的树有二叉树、二叉搜索树和AVL树等。
5.图图是一种非线性数据结构,它由节点和边组成,节点之间的边可以有多个。
图可以分为有向图和无向图,如果图中的边有权重,则称为带权图。
二、算法算法是一组解决问题的规则和步骤,它们可以用于开发计算机程序,用于数据处理、数学计算、自然语言处理、图形处理和人工智能等领域。
常见的算法有排序、搜索、动态规划、回溯和贪心等。
1.排序排序是将一组数据按照一定规则进行排列的过程。
常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。
2.搜索搜索是一种算法,它在一个数据集合中查找一个特定的值。
常见的搜索算法有线性搜索、二分搜索、哈希搜索和广度优先搜索等。
3.动态规划动态规划是一种算法,它通过将问题分解成子问题来解决复杂问题。
常见的动态规划算法有背包问题、最长公共子序列、最短路径和编辑距离等。
4.回溯回溯是一种算法,它通过扩展现有解来解决问题。
回溯法通常用于解决组合、排列和子集等问题。
5.贪心贪心是一种算法,它在每个阶段选择最佳的解决方案。
贪心算法通常用于求解最优解问题。
三、总结数据结构和算法是计算机科学中最重要的两个基础学科。
掌握好数据结构和算法是每个程序员必须的基本功。
数据结构学习笔记

数据结构1.数据结构的分类:1.按逻辑结构分类:{集合;线性结构【一维数组;队列;栈】;非线性结构【树;图;多维数组】}按存储结构分类:{顺序存储;链式存储;索引存储;散列存储}2.树和二叉树1.树树的度数的总和加1等于树的结点数之和。
N=K+1.树的遍历:{前序遍历【先根结点,后子结点】;后序遍历【先叶子结点,后根结点】;层次遍历【按树的结构层次遍历】}2.二叉树的重要特性;(1)在二叉树的第i层上最多有2的(i-1)次方个结点。
(2)深度为k的二叉树最多有2的k次方-1个结点。
(3)对于任何一棵二叉树,其叶子结点数为N0,度为2的结点数为N 2,则N0=N2+1。
(4)如果对一棵有n个结点的完全二叉树的结点按层序编号(从第一层到|_log2n_|+1层,每层从左到右),则对任一结点i(1≦i≦n),有:如果i=1,则结点i无父结点,是二叉树的根;如果i>1,则父结点是|_i/2_|。
如果2i>n,则结点i为叶子结点,无左结点;否则,其左子结点为2i。
如果2i+1>n,则结点i无右子结点,否则,其右子结点为2i。
二叉树的遍历:{前序遍历【根-左-右】;中序遍历【左-根-右】;后序遍历【左-根右】;层次遍历【按层次遍历】}树到二叉树之间的转换:规则:同层结点中只保留左子树结点,其余兄弟结点均转换为右子树。
依次类推。
方法:只保留父结点与其下的左子结点的连线,其他所有结点连线删除。
水平连接同根的兄弟结点,然后整理成二叉树。
注意:二叉树的中序遍历和树的后序遍历是对应的。
可以依次检验转换是否正确。
3.查找二叉树(二叉排序树)一颗查找二叉树,或者是一颗空树,或者满足以下递归条件:(1)查找树的左、右子树各是一颗查找树。
(2)若查找树的左子树非空,则其左子树的各节点值均小于根节点的值。
(3)若查找树的右子树非空,则其右子树上的各节点值均大于根节点的值。
查找二叉树的插入结点操作,分以下几种情况进行相应处理:(1)如果相同键值的结点已经在二叉树中,则不再插入。
专业课数据结构笔记

专业课数据结构笔记在大学的众多课程中,数据结构这门专业课就像一座神秘而又充满挑战的山峰,等待着我去攀登和征服。
对于我这个初涉计算机领域的小白来说,它既新奇又让人有点头疼。
还记得刚开始接触数据结构这门课的时候,我满心期待又略带紧张。
第一堂课上,老师在黑板上写下那些复杂的概念和算法,我瞪大了眼睛,试图把每一个字都装进脑子里。
那感觉,就像是被扔进了一个充满了奇怪符号和逻辑的迷宫。
随着课程的推进,我发现数据结构可不是闹着玩的。
就拿线性表来说吧,什么顺序表、链表,一开始真是让我晕头转向。
为了搞清楚这些,我可是下了大功夫。
有一次,我在图书馆找了个安静的角落,准备和线性表“大战一场”。
我摊开课本,拿出笔记本,把书上的定义、示例,一个字一个字地抄下来。
顺序表,就像是一排紧紧挨着的小房子,每个房子里都装着特定的数据,找起来倒是方便,可要是想插个新数据进去,那就得大动干戈,把后面的房子都往后挪一挪。
而链表呢,就像是一群调皮的孩子手拉手,要找数据得顺着一个一个的“手”找过去,插入新数据倒是轻松,改改拉手的关系就行。
我一边在笔记本上画着图,一边嘴里念念有词,“这个指针指到这,那个节点连到那……”旁边的同学看我这副认真又有点滑稽的样子,忍不住笑了。
可我顾不上,我心里只有一个念头,一定要把这玩意儿搞明白!说到栈和队列,那也是别有一番“风景”。
栈就像一个只能从一端进出的筒子,先进去的后出来,这叫“后进先出”。
我就想象自己在往一个筒子里塞东西,最后放进去的得最先拿出来,这感觉还挺奇妙的。
有一回,我在宿舍里拿着一堆笔和本子模拟栈的操作。
舍友们都觉得我走火入魔了,可我不在乎。
我把笔一支一支地放进去,再一支一支地拿出来,嘴里还不停地说着,“这是进栈,这是出栈……”到最后,我终于搞清楚了栈的原理,那种成就感,简直没法形容。
队列则像是一条有序的队伍,先进去的先出来,“先进先出”。
我会想象在超市排队结账的场景,先来的人先结账离开。
为了更深刻地理解,我还去观察了学校食堂排队打饭的队伍,看人们是怎么依次前进的。