算法设计

掌握

  1.C程序设计语言

  2.知道程序员进行编程、测试,并进行必要的优化

  3.常用数据结构及其上的常用操作

  4.排序算法、查找算法

  5.灵活运用各种算法设计策略

 

指针:很多数据结构都是基于指针实现的

  链表、链式队列、链栈、二叉树……

  本质:一个用来存储地址的变量

  常指针:一旦赋值后就不能修改。例,数组名:存储空间的首地址。当形参声明为指针时,可以将数组名作为实参进行传递。

  参数传递:当指针作为函数参数传递时,需要特别主语C语言中的“值”传递原则。

    C函数形参、实参之间只是“值传递”。

    调用时,实参应该是指针的“地址”(或指向指针的指针)

    

 

 线性表:线性结构

  最简单、最常见

  线性表的长度、空表、前驱结点、后继节点

  线性表节点:表元、记录。同一类型的数据,可由若干成分组成。唯一标识的成分,关键字(键)

  存储:

    (1)顺序存储:

      优:访问方便,可以直接访问线性表中的任意节点,loc(ai)=loc(a1)+(i-1)*l  ;  

      缺点:不利于插入、删除;大小固定,浪费大量存储空间

 

    (2)链式存储:用链表存储

      缺点:存储地址指针,浪费空间;直接访问节点不方便

      分类:单链表、循环链表、双向链表

 

队列(Quene):先进先出(FIFO)

  队首:出队、队尾:进队

  存储:队列(顺序存储)、链队列(链表)

  优先级队列:每次出队的是队列中最高优先级的元素

 

栈(Stack):后进先出(LIFO)

  栈顶:进栈,出栈;栈尾

  存储:顺序栈、链栈

  注意:同以步骤操作时,入栈的顺序由出栈的顺序决定,不可颠倒。

 

  小顶堆、大顶堆

  可以看做是一颗完全二叉树。堆与一颗完全二叉树对应,但堆本身是线性表

  应用:堆排序。

 

数组:

  最常用的数据结构

  常用顺序存储的线性表

  维数、多维数组(表示矩阵:对称矩阵、三角矩阵、三对角矩阵)

  分类:静态数组(顺序存储结构)、动态数组(链式存储结构)

  稀疏矩阵:存储:用顺序存储结构的三元组存储,分别记录行、列、值

 

树:

  非线性数据结构,是递归的(由子树构成,子树又由更小的子树构成)

  根节点、子树、节点的度、树的度、树的深度、有序树、无序树

  树的遍历:前序、后序、层序

 

二叉树:

  非线性数据结构,具有递归性质

  

  

  二叉树的遍历:先序、中序、后序、层序

  二叉排序树:

    或者是一棵空树,或者是具有下列性质的二叉树

    (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    (3)左、右子树也分别为二叉排序树;
    (4)没有键值相等的结点。

      

 

  完全二叉树:所有非终端节点的值均不大于(或小于)其左右孩子节点的值

    与二叉排序树的区别

    与满二叉树的区别

 

  B树、B-树、B+树、B*树

 

   平衡二叉树

 

  转移矩阵:第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'是字符串数组的结束标志,编程时注意

  代码中输出问题的提示,给出了操作的意图,需注意认真阅读

 

 

  

 

  

posted @ 2016-09-03 13:57  PanPan003  阅读(616)  评论(0编辑  收藏  举报