算法(3)

1.算法的四个特性:

  (1)有穷性;  (2)确定性;  (3)可行性;  (4)输入和输出;

2.

  (1)穷举法(万能算法):如求N个数的全排列

    8皇后问题

  (2)分而治之(建而治之):

    二分查找:减为治之

    归并排序:分而治之 

  (3)贪心

    最小生成树Prim Kruskal

    单源最短路径  Dijkstra

  (4)动态规划

    背包(最大价值的背包)

    士兵路径

3.复杂度

  (1)时间复杂度

  (2)空间复杂度

  (3)时空复杂度

    使用O记号来表示

    时间:基本操作次数(汇编指令条数)

    空间:占用内存字节数

    区别:空间可以再利用

    时空互换(Hash表),将时空互换的技术,利用硬件的性能来做这件事

  (4)在实现之前,我们要预估算法所需要的资源

  (5)常见的时间复杂度分析方法

    循环次数

    均摊分析

    递归式---主定理

  (6)常见的时间复杂度:

    O(1)

      基本运算,+,-,*,/,%,寻址

    O(logn)

      二分查找,分治

    O(n^1/2)

      枚举约数

    O(n)

      线性查找

    O(n^2)

      朴素最近点对,冒泡排序,

    O(n^3)

      Floyd最短路径,求任意两点间的最短路径

      普通矩阵的乘法

    O(nlogn)

      归并排序

      快速排序的期望复杂度

      基于比较排序的算法下界(每次对比两个元素,如果需要交换的话,那么最小的时间复杂度就是nlogn)

    O(2^n)

      枚举全部的子集

    O(n!)

      枚举全排列

    总结:

      优秀O(1)<O(logn)<O(n^1/2)<O(n)<O(nlogn)

      可能可以优化O(n^2)<O(n^3)<O(2^n)<O(n!)

4.均摊分析:

    (1)多个操作一起算时间复杂度

    (2)Multipop的队列,可以一次性出k个元素,每个元素只出入队列一 次

    (3)动态数组尾部插入操作:一旦元素超过容量限制,则扩大一倍,在复制

5.例题:

  给定数组a[1.......n],求最大子数组和,即找出1<=i<=j<=n,使a[i]+a[i+1]+...+a[j]最大

  

  介绍三种算法

    (1)暴力枚举O(n^3)

      三重循环

      先找子数组的左端点,然后找子数组的右端点,然后求和,找到最大的和来更新这个答案

      

    (2)优化枚举O(n^2)

    (3)贪心算法O(n)

posted @ 2019-02-24 22:02  stone1234567890  阅读(148)  评论(0编辑  收藏  举报