【软考】【数据结构】算法基础

  算法与数据结构的关系:算法的实现依赖于数据结构的设计,尽管在设计算法步骤时可以不考虑数据结构,但算法在计算机上与采用的数据结构密切相关。算法的效率与数据结构有一定的关系,但并不是数据结构越简单算法的效率就会越高。

1.算法的特性

  有穷性:执行有穷步之后结束
  确定性:每一条指令都必须有确切含义
  有效性:每个步骤都能有效执行并能得到确定结果
  输入>=0个,输出>=1个

2.算法设计目标

  正确性:应满足具体问题的需求
  可读性:便于阅读和交流
  健壮性:输入数据非法时,能适当的做出反应或进行处理,不会产生莫名其妙的输出结果
  效率与低存储需求:效率是指算法的执行时间,存储量需求是指算法执行过程中所需的最大存储空间

3.算法的复杂度

  空间复杂度:算法在运行过程中临时占用存储空间大小的度量
  时间复杂度:程序运行从开始到结束所需要的时间。
常见的对算法执行所需时间的度量:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n) O ( 1 ) < O ( l o g 2 n ) < O ( n ) < O ( n l o g 2 n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n )
O(1)是指时间复杂度为常数级的,单条语句
O(n)单层循环
O(n^2)双层循环
O(n^3)三层循环
O(log2 n)排序二叉树查找键值,n为结点数量,log2 n 为比较的次数
O(n log2 n)

4.常用经典算法

  迭代法:用于求方程或方程组近似根的一种常用算法。
  穷举搜索法:对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从中找出那些符合要求的候选解作为问题的解。
  递推法:利用问题本身所具有的一种地推关系求问题的解。典型用法是整数的阶乘。
    整数阶乘: n!=(n1)!×n n ! = ( n − 1 ) ! × n
  递归法:设法将问题分解成一些规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解方法和综合方法。递推阶段,把复杂问题的求解推到较简单的问题求解上;回归阶段:获得最简单情况的解后逐级返回,获得稍复杂问题的解。典型用法是菲波那切数列和背包问题。
    菲波那切数列: F0=0,F1=1,Fn=Fn1+Fn2 F 0 = 0 , F 1 = 1 , F n = F n − 1 + F n − 2
    背包问题:有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
     分析:如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中
  回溯法:也称为试探法。放弃当前候选解去寻找下一个候选解的过程称为回溯;扩大当前候选解的规模并继续试探过程称为向前试探。典型用法是n皇后问题。
    n皇后问题:在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
  贪心法:一种不追求最优解,只希望得到较为满意解的方法。典型用法是装箱问题、马踏棋盘问题。
    装箱问题:有n和物品,每个物品体积v1, v2, v3……大小不一,但是都小于箱子体积大小V,现在将所有物品都打包装进箱子,要求装完这些物品之后打开的箱子数量尽量小,求打开的箱子数量是多少?
      分析:将所有物品按照体积大小降序排列,按照箱子打开的顺序,每一次从头遍历箱子结点,看打开的箱子的剩余体积能不能放下当前物品,直到遍历完所有已经打开的箱子还是放不下,就打开一个新的箱子。
    马踏棋盘问题:
  分治法:把大问题的解分解成一些较小的问题,然后由小问题的解方便地构造出大问题的解。典型用法是Hanoi塔、比赛日程安排。
    Hanoi塔:
    比赛日程安排问题:
  动态规划法:与分治法类似,将大问题分解成子问题,先求子问题,然后从这些子问题的解得到原问题的解,子问题往往不是独立的。

你可能感兴趣的:(软考)