ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:35.77KB ,
资源ID:3905047      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3905047.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(程序员数据结构学习笔记.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

程序员数据结构学习笔记.docx

1、程序员数据结构学习笔记程序员数据结构笔记作者: 来源: 点击: 136 日期:2008-3-16 15:34:27 知识:1.数据结构中对象的定义,存储的表示及操作的实现.2.线性:线性表、栈、队列、数组、字符串(广义表不考)树:二叉树集合:查找,排序图(不考)能力:分析,解决问题的能力过程: 确定问题的数据。 确定数据间的关系。 确定存储结构(顺序数组、链表指针) 确定算法 编程 算法评价(时间和空间复杂度,主要考时间复杂度)一、数组1、存放于一个连续的空间2、一维多维数组的地址计算方式已知data00的内存地址,且已知一个元素所占内存空间求dataij在内存中的地址。公式:(add+(i*

2、12+j)*S)(假设此数组为data1012)注意:起始地址不是data00时候的情况。起始地址为data-38和情况;3、顺序表的定义存储表示及相关操作4、顺序表操作中时间复杂度估计5、字符串的定义(字符串就是线性表),存储表示模式匹配算法(简单和KMP(不考)6、特殊矩阵:存储方法(压缩存储(按行,按列)三对角:存储于一维数组三对角问题:已知Aij能求出在一维数组中的下标k;已知下标k求Aij。7、稀疏矩阵:定义,存储方式:三元组表、十字链表(属于图部分,不考) 算法 数组中元素的原地逆置; 对换 在顺序表中搜索值为X的元素; 在有序表中搜索值为X的元素;(折半查找) 在顺序表中的第i个

3、位置插入元素X; 在顺序表中的第i个位置删除元素X; 两个有序表的合并;算法?线性表数据结构定义:Typedef struct int datamax_size;int len;linear_list; 模式匹配 字符串相加 求子串 (i,j)K 注意:不同矩阵所用的公式不同; 稀疏矩阵的转置(两种方式,后种为妙) 和数组有关的算法 -例程:求两个长整数之和。a=130*b=87081299数组:a:1 3 0 5 6 9 5 2 1 6 8b:8 7 0 8 1 2 9 9 由于以上的结构不够直观(一般越是直观越容易解决) 将其改为:a:118 6 1 2 5 9 6 5 0 3 1 a0=

4、11(位数)b: 89 9 2 1 8 0 7 8 0 0 0 b0=8c进位0 1 1 0 0 1 1 1 1 0 0 c:117 6 4 3 3 0 4 4 2 3 1 c0的值(C位数)由cmax_s+1决定!注意:在求C前应该将C(max_s+1)位赋0.否则为随机数; 较小的整数高位赋0.算法:已知a,b两个长整数,结果:c=a+b;总共相加次数: max_s=max(a,b)程序:for(i=1;i=max_s;i+) k=ai+bi+ci;ci=k%10;ci+1=k/10;求c位数:if(cmax_s+1=0)c0=max_s;elsec0=max_s+1;以下代码是我编的(毕

5、竟是初学者.不太简洁大家不要见怪!):/*两长整数相加*/ #include #include#define PRIN printf(n);int flag=0; /*a0b0?1:0*/* max(a,b) */change(char da,char db,int a,int b,int c) int i;if(a0b0) for(i=1;i=a0;ai=daa0-i-0,i+); /*a0-0 so good!*/for(i=1;i=b0;bi=dbb0-i-0,i+);for(i=b0+1;i=a0;bi=0,i+);for(i=1;i=a0+1;ci=0,i+);flag=1;else

6、 for(i=1;i=b0;bi=dbb0-i-0,i+);for(i=1;i=a0;ai=daa0-i-0,i+);for(i=a0+1;i=b0;ai=0,i+);for(i=1;i=b0+1;ci=0,i+);add(int a,int b,int c) int i,sum;if(flag=1) for(i=1;i=a0;i+) sum=ai+bi+ci;ci+1=sum/10;ci=sum%10;if(ca0+1=0)c0=a0;elsec0=a0+1;else for(i=1;i=1;i-)printf(%d,mi); PRINmain()int s;int a20,b20,c20;

7、char da=123456789;char db=12344443;a0=strlen(da);b0=strlen(db);printf(a0=%dt,a0);printf(b0=%d,b0); PRINchange(da,db,a,b,c);printf(flag=%dn,flag); PRINprintf(-n);if(flag=1) print(a); PRINs=abs(a0-b0);printf(+);for(s=s*2-1;s0;s-)printf( );print(b); PRINelse s=abs(a0-b0);printf(+);for(s=s*2-1;s0;s-)pri

8、ntf( );print(a); PRINprint(b); PRINadd(a,b,c);printf(-n);print(c);时间复杂度计算: 确定基本操作 计算基本操作次数 选择T(n) lim(F(n)/T(n)=c 0(T(n)为时间复杂度上例子的时间复杂度为O(max_s); -二:链表1、知识点逻辑次序与物理次序不一致存储方法;单链表的定义:术语(头结点、头指针等)注意带头结点的单链表与不带头结点的单链表区别。(程序员考试一般不考带头结点,因为稍难理解)插入、删除、遍历(p=NULL表明操作完成)等操作 循环链表:定义,存储表示,操作; 双向链表:定义,存储方法,操作;单链表和

9、循环链表区别在最后一个指针域值不同。2、操作单链表:插入X,删除X,查找X,计算结点个数单链表的逆置(中程曾考)head-NULL/p-a1/p-a2/p-a3/pan/NULL 注:p代表指针;NULL/p代表头结点 head-NULL/p-an/p-an-1/p-an-2/pa1/NULL 循环链表的操作:插入X,删除X,查找X,计算结点个数;用p=head-next来判断一次计算结点个数完成;程序段如下:k=0;dok+;p=p-next;while(p!=head-next); 双向链表多项式相加 有序链表合并 -例程:已知两个字符串S,T,求S和T的最长公子串;1、逻辑结构:字符串2

10、、存储结构:数组3、算法:精化(精细化工)*老顽童注:此处“精细化工”说明好像不对!s=abaabcacb t=abdcabcaabcda当循环到s.len-1时,有两种情况:s=abaabcacb、s=abaabcacb s.len-2时,有三种情况:s=abaabcacb、s=abaabcacb、s=abaabcacb .1 s.len种情况程序思路:tag=0 /没有找到for(l=s.len;l0&!tag;l-) 判断长度为l的s中的子串是否为t的子串;若是:tag=1;长度为l的s的子串在s中有(s.len-l+1)个。子串0:0l-11:1l2:2l+13:3l+2 s.len-

11、l:s.len-ls.len-1由上面可得:第j个子串为jl+j-1。判断长度为l的s中的子串是否为t的子串:for(j=0;j0&tag=0;l-) for(j=0;js.len-l+1&!tag;j+) ? 用模式匹配方法确定sjsl+j-1这个字符串是否为t的子串; /好好想想 若是,tag=1;第二天 转眼又过了一周了,前面一周里面我编了一些程序:链表,长整型数相加,三元组表转置以及一些简单的函数.其实有些算法想想是很简单,不过写起来还是需要一定耐心和C基础的,如果你自己觉得各算法都很懂了,不妨开机编编试试.或许会有一些新的发现与体会.栈和队列1、知识点: 栈的定义:操作受限的线性表

12、特点:后进先出 栈的存储结构:顺序,链接/ push(s,d) 栈的基本操作: pop(s)栈定义:struct datatype datamax_num;int top;队列定义特点:先进先出/入队列 in_queue(Q,x)队列的操作:出队列 del_queue(Q)队列存储结构:链队列:Typedef struct nodeDatatype data;Struct node *next;NODE;Typedef struct NODE *front;NODE *rear;Queue;顺序队列:struct datatype datamax_num;int front,rear;问题:队

13、列线性表假溢出=循環队列队列满,队列空条件一样5!=4!=3!=2!=1!=0!2) 回归 720=120=24=6 =2 =1 后缀5) 迷宫问题6) 线性链表的递归算法 一个链表=一个结点+一个链表int fuction(NODE *p) if(p=NULL) return 0;else return(function(p-next);树与二叉树一、 知识点:1. 树的定义: data_struct(D,R);其中:D中有一个根,把D和出度去掉,可以分成M个部分.D1,D2,D3,D4,D5DMR1,R2,R3,R4,R5RM而子树Ri形成树.1) 递归定义 高度 2) 结点个数=1O-0

14、OO-1OOOO-2此树的高度为22.二叉树定义:结点个数=0 .3. 术语:左右孩子,双亲,子树,度,高度等概念.4. 二叉树的性质层次为I的二叉树 I层结点 2I 个高度为H的二叉树结点 2H+1-1个H(点)=E(边)+1个数为N的完全二叉树高度为|_LOG2n_|完全二叉树结点编号:从上到下,从左到右. i结点的双亲:|_i/2_|_i-1/2_|1i结点的左孩子:2i2i+123i结点的右孩子:2i+12i+24567(根)1为起点0为起点二叉树的存储结构:1) 扩展成为完全二叉树,以一维数组存储。 ABCDEFGHI数组下标0123456789101112元素ABCDEFGHI2)

15、 双亲表示法 数组下标012345678元素ABCDEFGHI双亲-1001223343) 双亲孩子表示法 数组下标012345元素ABCDEF双亲-100122左子134右子2-15结构:typedef struct datatype data;int parent;int lchild;int rchild;NODE;NODE treeN; / 生成N个结点的树4) 二叉链表5) 三叉链表6) 哈夫曼树5.二叉树的遍历先根 中根 栈 中根遍历(左子树)根(右子树),再用相同的方法处理左子树,右子树.后根 /先,中序已知求树:先序找根,中序找确定左右子树.层次遍历(队列实现)6.线索二叉树(

16、穿线树)中序线索二树树目的:利用空指针直接得到中序遍历的结果.手段(方法):左指针为空,指向前趋,右指针为空,指向后继.结点结构: ltagLchDatarchrtagLtag=0,lch指向左孩子,ltag=1,指向前趋结点Rtag=0,rch指向右孩子;rtag=1,指向后继结点中序遍历: 1) 找最左结点(其左指针为空)2) 当该结点的rtag=1,该结点的rch指向的就为后继3) 当rtag=0,后继元素为右子树中最左边那个N个结点的二树有空指针N+1个周六我去了周SIR的办公室,他很热情,我问的是中序线索化二叉树的问题(递归),关于这个问题我会在以后的笔记中作重点补充。我在这学校从来

17、没有碰到过像他这样热情的老师,真的,大一的时候我们学校就开了C,当时我就连#include这句话的意思都不晓得,别说是让我写程序了(到这份上也不怕把丑事都抖出来了:数据结构的课程设计也是哈科大的littlebob兄帮我做的,很遗憾,他高程就差几分,希望他早日成功,我们都要向他学习)等于说我的C知识九成都是在大二下学期的时候学的。而且全是自学的。拿这个周末来说吧。我三天时间就看完了一本C语言大全。当然,并不是从头到尾,只是根据自己的实际情况,重点是指针和数据结构那块。C最要的便是指针。程序员考试下午试题最重要的便是递归问题(12道,没有掌握就没希望了哦)。我说这些并不是为了表明自己多么用功,只是

18、希望每位学者都有所侧重。第三天 排序查找是我自己觉得最头疼的算法了,常搞混去的啊.不知道各位学得如何,如果不错,还请告诉我一些经验!查找一、 知识点/静态查找-数组1、 什么是查找动态查找-链树顺序查找,时间复杂度 O(n)折半查找:条件:有序;时间复杂度 O(nlog2n) (时间复杂度实际上是查找树的高度)索引查找:条件:第I+1块的所有元素都大于第块的所有元素。算法:根据index来确定X所在的块(i) 时间复杂度:m/2在第块里顺序查找X 时间复杂度:n/2总的时间复杂度:(m+n)/2二叉排序树1)定义:左子树键值大于根节点键值;右子树键值小于根的键值,其左右子树均为二叉排序树。2)

19、特点:中序遍历有序-(删除节点用到此性质)3)二叉排序树的查找:如果根大于要查找的树,则前左子树前进,如果根小于要查找的树,则向右子树前进。4)结点的插入-二叉排序树的构造方法5)结点删除(难点) 1、右子树放在左子树的最右边2、左子树放在右子树的最左边avl树(二叉平衡树):左右子树高度只能差层,即h=1其子树也一样。B树:n阶B树满足以下条件1)每个结点(除根外)包含有N2N个关链字。2)所有叶子节点都在同一层。3)B树的所有子树也是一棵B树。特点:降低层次数,减少比较次数。排序一、知识点1、排序的定义/内排序:只在内存中进行2、排序的分类外排序:与内外存进行排序内排序:/直接插入排序1)插入排序shell排序/冒泡排序2)交换排序快速排序/简单选择排序3)选择排序 堆 锦标赛排序4)归并排序(二路)5)基数排序(多关链字排序)3、时间复杂度(上午题目常考,不会求也得记住啊兄弟姐妹们!)* * * * * * 15 * * * 15 * * */稳定 * * * * * * * * 15 15 * * * *(前后不变)排序 不稳定* * * * * * * * 15 15 * * * *(前后改变)经整理得:选择、希尔、堆、快速排序是不稳定的;直接插入、冒泡、合并排序是稳定的。锦标赛排序方法:13161118213

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1