数据结构和算法基础(野路子补基础系列)

  1. 算法五个重要特征:
  • 有穷性:保证执行有限步骤之后结束;
  • 确切性:每一步骤都有确切的定义;
  • 输入:每个算法有零个或多个输入,以刻画运算对象的初始情况,所谓零个输入是指算法本身定除了初始条件;
  • 输出:每个算法有一个或多个输出,显示对输入数据加工后的结果。没有输出的算法是毫无意义的;
  • 可行性:在原则上算法能够精确地运行,进行有限次运算后即可完成一种运算。
  1. 常用基本算法:
    快排 堆排序 归排序 二分查找 线性查找 广度优先 深度优先 动态规划

  2. 常见算法思想:
    枚举 递推 递归 分治 贪心 迭代

  3. 时间复杂度和空间复杂度:

  • 时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。

  • 时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

  • 时间复杂度(从小到大)
    常数阶<对数阶<线性阶<线性对数阶<平方阶<立方阶<K次方<指数阶
    优先多项式,指数容易爆炸。

  • 顺序结构可以求和,取max,循环结构用乘法。复杂结构可分,然后去低阶、去常数、去高阶常参。

  • 空间复杂度
    一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。  
    (1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
    (2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
    一个算法所需的存储空间用f(n)表示。S(n)=O(f(n)) 其中n为问题的规模,S(n)表示空间复杂度。

  1. 常见数据结构
    数组 队列 堆 栈 链表 树 图 散列表
  • 四大结构:集合结构 线性结构 图形结构 树形结构
  • 数据类型:在C语言中,数据类型可以分为:
    原子类型:不可以再分解的基本类型,例如整型、浮点型、字符型等。
    结构类型:由若干个类型组合而成,是可以再分解的,例如整型数组是由若干整型数据组成的。
  • 两种存储方式:顺序存储 链式存储
  • 栈:一端 先进后出 常见操作:push pop peek length clear
  • 队列:两端 后进先出
  • 图:有向 无序 简单 两个数据:顶点、表明是否访问的哈希值
  • 二叉树的特点:
    每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。二叉树中每一个节点都是一个对象,每一个数据节点都有三个指针,分别是指向父母、左孩子和右孩子的指针。每一个节点都是通过指针相互连接的。相连指针的关系都是父子关系。
  • 二叉树的五种基本形态:
    空二叉树
    只有一个根结点
    根结点只有左子树
    根结点只有右子树
    根结点既有左子树又有右子树

参考:SegmentFault 技术周刊 Vol.31 – 码农也要学算法

    原文作者:madpluto
    原文地址: https://www.jianshu.com/p/a2a76f3d0293
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞