数据结构与算法初体验
数据
能够被计算机以***二进制***存储、识别和计算的东西都叫做数据。
硬盘中:mp3、jpg、doc、avi、exe、txt
内存中:变量、常量、数组(在堆里)、对象(在堆里 )、字节码。
数据
数据与数据之间的一种或多种特定的关系。
数据结构 = 数据 + 数据之间的关系
数据结构主要解决的是将离散的问题整齐划一。
数据结构的逻辑结构
是指数据元素之间的相互关系,是我们想象出来的,并没有实质性的将其存储在计算机中。
集合结构:集合结构中的数据元素除了同属于一个集合外,他们之间没有其他关系。
线性结构:线性结构中元素是一对一的关系,就想一根穿起来的糖葫芦一样。
树形结构:树形结构中的关系存在一种一对多的关系。(自上向下)
图形结构:图形结构的元素是多对多的关系。
(树形结构图解)
(图形结构图解)
数据结构的物理结构
是指数据的逻辑结构在计算机中的存储形式。
顺序存储结构:开辟一组连续的空间存储数据,通常用数组来实现,数组本身是连续的,保证了数据之间的关系。
链式存储结构:开辟一组随机的空间存储结构,通常用节点来实现,节点不仅要存储数据,还要存储下一个节点的位置以保证数据之间的关系。
(顺序存储结构图解)
(链式存储结构图解)
计算机中有哪些数据结构的应用?
- 手机通讯录
- 计算机的文件系统
- 函数栈
- 游戏地图
- ……
什么是算法?
是解决特定问题求解步骤的描述,在计算机中表现为指令的有序数列,并且每条指令表示一个或多个操作,说白了(就是求解一个问题的步骤)。
如何评价一个算法的好坏?
设计算法要提高程序运行的效率,这里的效率大都指的是算法的执行时间。
事后统计法
这种方法主要是通过设计好的程序和数据,利用计算机计时器对不同算法程序的运行时间进行比较,从而确定算法效率的高低。
但是会有许多的缺陷
- 我们必须提前编好程序,再进行运行,如果程序处理的数据量较大,则会花费大量的时间和精力(计算一年都不是问题)。
- 时间的比较主要依赖于计算机硬件和软件环境。
- 算法的测试数据困难,在数据量较小的时候,不管什么算法其运行时间都是很微小的,相差几乎为。如果数据量大了,算法的优越性就出来了,但是这样会耗费很多的时间。
事前分析估算法
这种方法主要在计算机程序编程前,依据统计方法对算法进行估算。
一个高级程序语言编写的程序在计算机上运行所消耗的时间取决于下列因素:
- 算法采用的策略、方法
- 编译产生代码质量
- 问题的输入规模
- 机器执行指令的速度
第一条当然是算法的好坏最为重要,第2条有软件支撑、第四条要看硬件的性能
抛开与计算机硬件、软件有关的因素:一个程序的运行时间,依赖算法好坏的输入规模。
输入规模是指:输入量的多少。
算法的时间复杂度
常数阶O(1)
- 随着n的改变他的运算次数不发生改变。
int n = 100;
int sum = (n + 1) * n / 2;
线性阶O(n)
- 随着n值的不断增大,运算次数也在不断地增大。
循环的运行情况如下:
int sum = 0;
int n = 100;
for(int i = 1;i <= n;i++){
sum += i;
}
对数阶O(logn)
- 虽然有循环,但是也随着N的增大而增大,但是这种增大属于加速减小的加速运动。
int count = ;
int N = 10000;
while (count <N){
count = count * 2;
}
2^x = N 所以 x = log2(N)