• 算法(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)

  • 相关阅读:
    Djiango项目的创建以及配置介绍1
    最大矩形土地 单调栈或者DP
    0917 lxs 反思
    0915 反思
    codeforces 1209/C Paint the Digits 观察
    NOIP2014 解方程 秦九韶算法+多项式处理
    整数拆分问题
    机器人M号
    有趣的数列 唯一分解定理+卡特兰数
    数位DP 不要62
  • 原文地址:https://www.cnblogs.com/bigdata-stone/p/10428244.html
Copyright © 2020-2023  润新知