zoukankan      html  css  js  c++  java
  • 《啊哈!算法》笔记

    第 1 章 排序 
     桶排序 
     冒泡排序 
     快速排序  
     
    第 2 章 栈、队列、链表  

     队列  
     栈  
     链表  

      模拟链表  


    第 3 章 枚举!很暴力  

     奥数

     数的全排列 


    第 4 章 万能的搜索  

    深度优先搜索 
    广度优先搜索

    第 5 章 图的遍历

    深度和广度优先

    图的深度优先遍历 

    图的广度优先遍历 

    第 6 章 最短路径  
    第 1节 只有五行的算法——Floyd-Warshall  
    第 2节 Dijkstra算法——通过边实现松弛  
    第 3节 Bellman-Ford——解决负权边  
    第 4节 Bellman-Ford的队列优化  
    第 5节 最短路径算法对比分析

    第 7 章 神奇的树

    二叉树

    并查集  

    》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

    1.1桶排序---O(N+M)

    1.2冒泡排序---O(N^2)

      核心:双重嵌套循环

    1.3快速排序(二分法)---O(NlogN)

      1)找基准数    

      2)先从右往左找到一个小于6的数,再从左往右找一个大于6的数,交换

    1.4 去重、排序

      第一种方法:桶排序、

      第二种方法:先排序、后去重,冒泡排序或者快速排序

    2.1 队列

      线性结构,只允许在队列的首部 head 进行删除,在队列的尾部 tail 插入

      例子:买票;先进先出 FIFO

      结构体类型:

    struct queue
    {
    int data[100];//队列的主体,用来存储内容
    int head;//队首
    int tail;//队尾
    };

    2.2 栈

      例子:小桶放球;后进先出

      top:指向栈顶的变量

      用途:判断回文词,

    2.4 链表

      C语言中,可以使用 指针和函数malloc来实现。 

      也可以用数组模拟链表

        结构体 node,两个成员,data和指针

    struct node *head;
    head = NULL;//头指针为空
    
    struct node *p;
    //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
    p = (struct node *)malloc(sizeof(struct node));
    
    scanf("%d",&a);
    p->data = a;//将数据存储到当前结点的data域中
    p->next = NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空

        ->叫做结构体指针运算符,也是用来访问结构体内部成员的。因为此处p是一个指针,所以不能使用.号访问内部成员。

    2.5 模拟链表

      用数组模拟链表

      两个数组,data 和 left

    3.1 枚举

    3.2 炸弹人

      使用数组模拟地图

    3.3 火柴棍模式

      核心是 求方程的解,

    3.4 数的全排列

    4.1 深度优先搜索 (Depth First Search, DFS)

      基本模型

    void dfs(int step)
    {
        //判断边界
        //尝试每一种可能 
        for(i=1;i<=n;i++)
        {
                继续下一步 dfs(step+1);
        }
        返回
    }

     数字全排列

    4.2 迷宫问题

    4.3 广度优先搜索(宽度优先搜索)Breadth First Search, BFS

      层层递增

    4.4 炸弹人 用 dps、bfs 解

    4.5 宝岛探险

    4.5 水管工游戏

      

    五、图的遍历

    5.1 深度和广度优先

       图的邻接矩阵法

    5.2 图的深度优先遍历

      

    六、最短路径

      6.1 Floyd-Warshall,

      6.2 Dijikstra 算法——通过边实现松弛

        曲线救国

      6.3 Bellman-Fod——解决负权边

    for(k=1;k<=n-1;k++)
        for(i=1;i<=m;i++)
            if(dis[v[i]] > dis[u[i]] + w[i])
                dis[v[i]] = dis[u[i]] + w[i];

      6.4 Bellman-Ford 的队列优化

      

      6.5 最短路径算法对比分析

    七、树

    7.1 树

      树:不包含回路

      图:包含回路

      树的特点:1,树中的任意两个结点有且只有一条路径联通。2,n个结点则有n条边。3,在一棵树中加一条边将会构成一个回路。

    7.2 二叉树

      完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

      满二叉树的任意节点,要么度为0,要么度为2.

    7.3 堆

      一种特殊的二叉树

      最小堆:所有父节点都比子节点要小

      最大堆:所有父节点都比子节点要大

      应用:

      

      优先队列:支持插入元素和寻找最大(小)值元素的数据结构

    7.4 并查集

      

      

  • 相关阅读:
    你所不知道的mfc…mfc项目索引 &mfc调优指南 &mfc vc添加添加子功能指南
    Cu 大彻大悟内存管理 mm (update 0410)
    [转]Linux iostat监测IO状态
    linux virtual memory layout by moniskiller upload [读书笔记]
    河畔找到的 面经笔经
    【转】Linux本地磁盘(硬盘)介绍
    读写UTF8、Unicode文件
    codesmith执行时提示“调用的目标发生了异常”的处理过程经验。
    DB2表信息以及字段信息的表
    iBatis.NET获取resultMap相关数据
  • 原文地址:https://www.cnblogs.com/IDRI/p/5750312.html
Copyright © 2011-2022 走看看