算法与数据结构
程序 = 数据结构 + 算法
——Nikiklaus Wirth
1 | /** |
[TOC]
解决问题的效率
1.解决问题的效率和数据的组织方式有关
2.解决问题的效率和空间的利用效率有关
3.解决问题的效率和算法的巧妙程度有关
抽象数据类型
- 数据对象集
- 操作集
抽象数据类型表示(ADT)数据结构
- 逻辑结构
- 线性
- 非线性
- 物理结构
- 顺序
- 链式
- 索引
- 散列
- 运算
- 有穷性 ~有穷步骤结束
- 确定性 ~每一步有明确定义
- 可行性 ~算法可行,能被计算机识别执行
算法分析
——————————-提高效率
- 空间复杂度S(n)——根据算法写成的程序在执行时占用存储单元的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。
- 时间复杂度T(n)——根据算法写成的程序在执行时耗费时间的长度。这个长度往往也与输入数据的规模有关。时间复杂度过高的低效算法可能导致我们在有生之年都等不到运行结果。
- 上界 O(f(n)) 能找到的最小上界(与真实情况贴近)
- 下界 Ω(g(n)) 能找到的最大下界
- worst 最坏复杂程度
- avg 平均复杂程度
线性非线性
一、线性结构:
1.线性结构作为最常用的数据结构,其特点是==数据元素之间存在一对一的线性关系==。
2.线性结构拥有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的,链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。
3.线性结构中存在两种操作受限的使用场景,即队列和栈。栈的操作只能在线性表的一端进行,就是我们常说的先进后出(FILO),队列的插入操作在线性表的一端进行而其他操作在线性表的另一端进行,先进先出(FIFO),由于线性结构存在两种存储结构,因 此队列和栈各存在两个实现方式。
二、非线性结构:
1.非线性结构中各个数据元素不再保持在一个线性序列中,==每个数据元素可能与零个或者多个其他数据元素发生联系==。根据关系的不同,可分为层次结构和群结构。
2.常见的非线性结构有:二维数组,多维数组,广义表,树(二叉树等),图。(其中多维数组是由多个一维数组组成的,所以不再是线性结构)。
线性结构
多项式存储方法
- 数组结构存储
- 链表结构存储
顺序表
1 |
|
链表
1 |
|
堆栈(顺序表)
1 | #include "stdio.h" |
堆栈(链表)
1 |
|
队列(链表)
1 | #include <stdio.h> |
多项式乘加
1 | #include <stdio.h> |
串(kmp)
1 |
|
非线性结构
树
树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的层次结构,很象自然界中的树那样。
二叉树遍历
1 |
|