如何学习算法

看懂程序的方法:

      1. 看流程(即步骤)

      2. 看功能

      3. 试数

      4. 敲,试错(如果实在不会看懂程序再敲)

算法:

  狭义的算法是与数据的存储方式密切相关

  广义的算法与数据的存储方式无关

  泛型:  利用某种技术达到的效果就是: 不同的存储方式,执行的操作是一样的

数据结构

  狭义:

  数据结构是专门研究数据存储的问题

  数据的存储包含两个方面: 个体的存储 + 个体关系的存储

  广义:

    数据结构既包含数据的存储也包含数据的操作

      对存储数据的操作就是算法

数据的存储结构有几种:

 线性结构:连续存储【数组】

       优点:存取速度很快 

       缺点:事先必须知道数组的长度,插入删除元素很慢,空间通常是有限制的,需要大块连续的内存块

      离散存储【链表】

      优点:空间没有限制, 插入删除元素很快

      缺点:存取速度很慢

 线性结构的应用:栈和队列

   栈

    定义: 一种可以实现“先进后出”的存储结构

    分类:静态栈

       动态栈

    算法:出栈

       压栈

    应用:函数调用;中断;表达式;内存分配;缓冲处理;迷宫

    队列

     定义: 一种可以实现“先进先出”的存储结构

     分类:链式队列: 用链表实现

     静态队列: 用数组实现

       静态队列通常必须是循环队列

     循环队列的讲解:

       1. 静态队列为什么必须是循环队列

       2. 循环队列需要几个参数来确定 

         需要两个参数来确定:front和rear

       3. 循环队列各个参数的含义

       建议初学者先记住,然后慢慢体会

       1). 队列初始化:front和rear的值都为零

       2). 队列非空:front代表的是队列的第一个元素;rear代表队列的最后一个有效元素

       3). 队列空: front和rear的值相等,但不一定是零

       4. 循环队列入队伪算法讲解

         两步完成:

        1. 将值存入r所代表的位置

        2. 错误的写法: r = r+1;

           正确的写法: r = (r+1)%数组的长度

       5. 循环队列出队伪算法讲解

          f = (f+1)%数组的长度

       6. 如何判断循环队列是否为空

          如果front=rear,则队列一定为空

       7. 如何判断循环队列是否已满

       预备知识: front的值可能比rear大,也可能比rear小,当然也可以两者相等

       两种方式:

        1. 多增加一个标识参数

        2. 少用一个元素(通常用第二种方式)

          如果r和f的值紧挨着,则队列已满。

         用c语言伪算法表示为:

         if((r+1)%数组长度==f)

           已满

         else

           不满

           队列算法:入队,出队

          队列的具体应用: 所以和时间有关的操作都有队列的影子

  

  非线性结构: 树,图

原文地址:https://www.cnblogs.com/spore/p/11080092.html