算法设计
掌握
1.C程序设计语言
2.知道程序员进行编程、测试,并进行必要的优化
3.常用数据结构及其上的常用操作
4.排序算法、查找算法
5.灵活运用各种算法设计策略
指针:很多数据结构都是基于指针实现的
链表、链式队列、链栈、二叉树……
本质:一个用来存储地址的变量
常指针:一旦赋值后就不能修改。例,数组名:存储空间的首地址。当形参声明为指针时,可以将数组名作为实参进行传递。
参数传递:当指针作为函数参数传递时,需要特别主语C语言中的“值”传递原则。
C函数形参、实参之间只是“值传递”。
调用时,实参应该是指针的“地址”(或指向指针的指针)
线性表:线性结构
最简单、最常见
线性表的长度、空表、前驱结点、后继节点
线性表节点:表元、记录。同一类型的数据,可由若干成分组成。唯一标识的成分,关键字(键)
存储:
(1)顺序存储:
优:访问方便,可以直接访问线性表中的任意节点,loc(ai)=loc(a1)+(i-1)*l ;
缺点:不利于插入、删除;大小固定,浪费大量存储空间
(2)链式存储:用链表存储
缺点:存储地址指针,浪费空间;直接访问节点不方便
分类:单链表、循环链表、双向链表
队列(Quene):先进先出(FIFO)
队首:出队、队尾:进队
存储:队列(顺序存储)、链队列(链表)
优先级队列:每次出队的是队列中最高优先级的元素
栈(Stack):后进先出(LIFO)
栈顶:进栈,出栈;栈尾
存储:顺序栈、链栈
注意:同以步骤操作时,入栈的顺序由出栈的顺序决定,不可颠倒。
堆:
小顶堆、大顶堆
可以看做是一颗完全二叉树。堆与一颗完全二叉树对应,但堆本身是线性表
应用:堆排序。
数组:
最常用的数据结构
常用顺序存储的线性表
维数、多维数组(表示矩阵:对称矩阵、三角矩阵、三对角矩阵)
分类:静态数组(顺序存储结构)、动态数组(链式存储结构)
稀疏矩阵:存储:用顺序存储结构的三元组存储,分别记录行、列、值
树:
非线性数据结构,是递归的(由子树构成,子树又由更小的子树构成)
根节点、子树、节点的度、树的度、树的深度、有序树、无序树
树的遍历:前序、后序、层序
二叉树:
非线性数据结构,具有递归性质
二叉排序树:
或者是一棵空树,或者是具有下列性质的二叉树:
完全二叉树:所有非终端节点的值均不大于(或小于)其左右孩子节点的值
与二叉排序树的区别
转移矩阵:第n次结果只受第n-1的结果影响,即只与当前所处状态有关,而与过去状态无关
邻接矩阵 :分为有向图(对称)、无向图两种
优先矩阵 :有权重
状态矩阵
Huffman树:最优树
带权路径(路径长度与节点权的乘积)最短的树。
哈夫曼树叶子节点才是有效数据节点!
应用:数据的最小冗余编码问题
哈夫曼编码:是一个通过哈夫曼树进行的一种编码,一般情况下,以字符:‘0’与‘1’表示。编码的实现过程很简单,只要实现哈夫曼树,通过遍历哈夫曼树,规定向左子树遍历一个节点编码为“0”,向右遍历一个节点编码为“1”,结束条件就是遍历到叶子节点!
图:
节点之间的关系可以是任意的
图的存储:邻接矩阵、邻接表(节点表:顺序;关系表:链接)
算法设计技术:重要:递归法、贪心法、回溯法
迭代法:
应用:数值计算近似求解。
注意:1,方程无解 2,迭代公式选择不当,活呆呆的初始近似根选择不合理
解决:1.考察方程是否有解 2.程序中对迭代的次数给予限制
应用:从候选解中选出问题的解
条件:1.解决的问题有有限中可能 2.没有更好的算法时
递推法:
利用问题本身所具有的一种递推关系求问题的解
应用:Fibonacci级数
递归法:
阶段:递推,回归
应用:Fibonacci数列、背包问题
程序分析:1.找出递归出口,以及出口条件 ;
应用:N后问题
程序分析:要有回溯代码,即各种可能都试一遍
贪心法:
不追求最优解,只希望得到较为满意解的方法;
已当前情况作为基础做出最优选择,而不考虑各种可能的整体情况;
所有贪心法不要回溯
一般可以快速得到满意的解。
应用:装箱问题
分治法:
最广泛
应用:Hanoi塔问题
背包问题:介绍
与分治法最大的差别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。
折半查找:
难点:确定待查关键字是下标为low?high?。示例法
1.第一遍答题完成,
一定要第二遍连着检验,因为第一题是在局部认识的情况下答题,第二遍是全面认识下的检查
最少两遍。
2.先看主函数,再看方法
3.
4.注意指针。** -> & ;实参到形参 * -> & ;给指针赋值,加& ;
判断是,注意==的情况
函数指针声明,加* ;属性指针声明,加* ;
数组是从0开始,与之相关的判定条件需注意;
注意n++、++n、n--、--n的不同,选择正确的
while循环:注意++,--,跳出循环前后是否需要--,++
判断条件,注意先后顺序
初始值的设定->操作数n++、++n、n--、--n
数组作为形参,只传数组名就可以,注意指针需要加&
指针初始化:(类型*)malloc(sizeof(类型))
形参为 **形参名 ,实参为 &指针名
5.寻找最优方案,有最优方案的比较
题目给出要用的算法,注意代码是否体现
6.
C语言中,'\0'是字符串数组的结束标志,编程时注意
代码中输出问题的提示,给出了操作的意图,需注意认真阅读