数据结构的起源ios
计算机从解决数值计算问题到解决生活中的问题算法
现实生活中的问题涉及不一样个体间的复杂关系数组
须要在计算机程序中描述生活中个体间的联系数据结构
数据结构主要研究非数值计算程序问题中的操做对象以及它们之间的关系函数
不是研究复杂的算法测试
数据结构中的基本概念spa
数据—程序的操做对象,用于描述客观事物设计
数据的特色:指针
能够输入到计算机code
能够被计算机程序处理
数据是一个抽象的概念,将其进行分类后获得程序设计语言中的类型。如:int,float……
数据元素:组成数据的基本单位
数据项:一个数据元素由若干数据项组成
数据对象 – 性质相同的数据元素的集合 (好比:数组,链表)
数据元素之间不是独立的,存在特定的关系,这些关系即结构
数据结构指数据对象中数据元素之间的关系
数据结构:研究关系
节点和节点之间的关系(数组、链表、树、图)
数据的逻辑结构
指数据元素之间的逻辑关系。即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。逻辑结构可细分为4类:
(集合)----数据元素间除“同属于一个集合”外,无其它关系
线性结构----一个对一个,如线性表、栈、队列
树形结构----一个对多个,如树
图状结构----多个对多个,如图
数据的物理结构
物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。它依赖于计算机
存储结构可分为4大类:顺序、链式、索引、散列
最经常使用的存储结构为:
顺序存储结构----借助元素在存储器中的相对位置来表示数据元素间的逻辑关系
链式存储结构----借助指示元素存储地址的指针表示数据元素间的逻辑关系
数据的逻辑结构与存储结构密切相关
算法设计à逻辑结构
算法实现à存储结构
数据的运算
在数据的逻辑结构上定义的操做,它在数据存储结构上实现
最多见的数据运算有5种:
插入、删除、修改、查找、排序
算法概念
算法是特定问题求解步骤的描述
在计算机中表现为指令的有限序列
算法是独立存在的一种解决问题的方法和思想
对于算法而言,语言并不重要,重要的是思想
算法和数据结构区别
数据结构只是静态的描述了数据元素之间的关系
高效的程序须要在数据结构的基础上设计和选择算法
程序=数据结构+算法
总结:
算法是为了解决实际问题而设计的
数据结构是算法须要处理的问题载体
数据结构与算法相辅相成
算法特性
输入:算法具备0个或多个输入
输出:算法至少有1个或多个输出
有穷性:算法在有限的步骤以后会自动结束而不会无限循环
肯定性:算法中的每一步都有肯定的含义,不会出现二义性
可行性:算法的每一步都是可行的
算法效率的度量
比较不一样算法对同一组输入数据的运行处理时间
缺陷
为了得到不一样算法的运行时间必须编写相应程序
运行时间严重依赖硬件以及运行时间的环境因素
算法的测试数据的选取至关困难
过后统计法虽然直观,可是实施困难且缺陷多
依据统计的方法对算法效率进行估算
影响算法效率的主要因素
算法采用的策略和方法
问题的输入规模
编译器所产生的代码
计算机执行速度
判断一个算法的效率时,每每只须要关注操做数量的最高次项,其它次要项和常数项能够忽略。
在没有特殊说明时,咱们所分析的算法的时间复杂度都是指最坏时间复杂度。
大O表示法
算法效率严重依赖于操做(Operation)数量
在判断时首先关注操做数量的最高次项
操做数量的估算能够做为时间复杂度的估算
O(5) = O(1)
O(2n+1) = O(2n) = O(n)
O(n2+n+1) = O(n2)
O(3n3+1) = O(3n3) = O(n3)
常见时间复杂度
执行次数函数 |
阶 |
非正式术语 |
12 |
O(1) |
常数阶 |
2n+3 |
O(n) |
线性阶 |
3n2+2n+1 |
O(n2) |
平方阶 |
5log2n + 20 |
O(logn) |
对数阶 |
2n+3nlog2n+19 |
O(nlogn) |
nlogn阶 |
6n3+2n2+3n+4 |
O(n3) |
立方阶 |
2n |
O(2n) |
指数阶 |
通常的关系:
O(1)< O(logn)< O(n)< O(nlogn)< O(n2)< O(n3)< O(2n)<O(n!)<O(nn)
1 //这次代码在codeblocks 17.12 下成功运行 2 #include <iostream> 3 4 using namespace std; 5 //时间换空间 6 /* 7 问题: 8 在一个由天然数1-1000中某些数字所组成的数组中,每一个数字可能出现零次 9 或者屡次。设计一个算法,找出出现次数最多的数字 10 */ 11 12 void Search(int *a, int len); 13 14 int main() 15 { 16 int ary[] = {1,1,2,8,8,8,9,4,4,5,6,7,9,9,9,9}; 17 Search(ary,sizeof(ary)/sizeof(*ary)); 18 return 0; 19 } 20 21 void Search(int *a, int len) 22 { 23 int sp[1000] = {0}; 24 int i = 0; 25 int Max = 0; 26 27 //将数组中的值减1赋给另一个数组的索引即下标 28 for(i=0; i<len; i++) 29 { 30 int index=a[i]-1; 31 sp[index]++; //计算每一个数字出现的次数 32 } 33 34 //在新的数组空间内找出最大的次数 35 for(i=0; i<1000; i++) 36 { 37 if(Max < sp[i]) 38 { 39 Max = sp[i]; 40 } 41 } 42 43 //输出出现最屡次数的数字 44 for(i=0; i<1000; i++) 45 { 46 if(Max == sp[i]) 47 { 48 //cout << "数字出现最多的次数为 " << Max << endl; 49 cout << "出现次数最多的数字为 " << i+1 << endl; 50 } 51 } 52 }