读这文章的人想必都是想报考或者将考程序员的同志们吧!首先一点必须问问自己,我考程序员的目的到底是为了什么?如果你的答案是:"只是为了拿一本证书".那我劝你早点GIVEUP吧!那样学起来会很累,因为没有兴趣.如果你想加入程序员的行列,为将来开发打下坚实的基础,那就试着看完这一小篇读书笔记吧!或许会对你有所帮助. 有句话必须记住:程序员考试仅仅是为了检验自己学到的而已,仅此而已!我想这便是程序员考试的最终意义所在吧!有些事情更注重过程! 数据结构 知识: 1.数据结构中对象的定义,存储的表示及操作的实现. 2.线性:线性表、栈、队列、数组、字符串(广义表不考) 树:二叉树 集合:查找,排序 图 能力: 分析,解决问题的能力 过程: 确定问题的数据。 确定数据间的关系。 确定存储结构(顺序-数组、链表-指针) 确定算法 编程 算法评价(时间和空间复杂度,主要考时间复杂度) 一、数组 1、存放于一个连续的空间 2、一维~多维数组的地址计算方式 已知data[0][0]的内存地址,且已知一个元素所占内存空间S求data[i][j]在内存中的地址。 公式:(add+S) 注意:起始地址不是data[0][0]时候的情况。起始地址为data[-3]和情况; 3、顺序表的定义 存储表示及相关操作 4、顺序表操作中时间复杂度估计 5、字符串的定义(字符串就是线性表),存储表示 模式匹配算法(简单和KMP(不考)) 6、特殊矩阵:存储方法(压缩存储(按行,按列)) 三对角:存储于一维数组 三对角问题:已知Aij能求出在一维数组中的下标k;已知下标k求Aij。 7、稀疏矩阵:定义,存储方式:三元组表、十字链表(属于图部分,不考) 算法 数组中元素的原地逆置;对换 在顺序表中搜索值为X的元素; 在有序表中搜索值为X的元素;(折半查找) 在顺序表中的第i个位置插入元素X; 在顺序表中的第i个位置删除元素X; 两个有序表的合并;算法? 线性表数据结构定义: Typedefstructlinear_list; 模式匹配 字符串相加 求子串 (i,j)<=>K注意:不同矩阵所用的公式不同; 稀疏矩阵的转置(两种方式,后种为妙) 和数组有关的算法 例程:求两个长整数之和。 a=13056952168 b=87081299 数组: a:13056952168 b:87081299 由于以上的结构不够直观将其改为: a:1186125965031a[0]=11 b:899218078000b[0]=8 c进位01100111100 c:1176433044231c[0]的值由c[max_s+1]决定! 注意:在求C前应该将C位赋0.否则为随机数;较小的整数高位赋0. 算法:已知a,b两个长整数,结果:c=a+b; 总共相加次数:max_s=max 程序: for 求c位数: if c[0]=max_s; else c[0]=max_s+1; 以下代码是我编的: /两长整数相加/ #include<stdio.h> #include<string.h> #definePRINprintf; intflag=0;/a[0]>b[0]?1:0/ /max/ change else } add if c[0]=a[0]; else c[0]=a[0]+1; } else if c[0]=b[0]; else c[0]=b[0]+1; } } voidprint main; chardb=; a[0]=strlen; b[0]=strlen; printf; printf;PRIN change; printf;PRIN printf; if else add; printf; print; } 时间复杂度计算: 确定基本操作 计算基本操作次数 选择T lim/T)=c 0)为时间复杂度 上例子的时间复杂度为O; 二:链表 1、知识点 逻辑次序与物理次序不一致存储方法; 单链表的定义:术语(头结点、头指针等) 注意带头结点的单链表与不带头结点的单链表区别。(程序员考试一般不考带头结点,因为稍难理解) |