程序=数据结构+算法
这个等式存在。各个中间件开发者
,架构师
。他们都在努力的优化中间件、项目结构以及算法提升运行效率
下降内存占用
。而且数据结构中也是蕴含模型以及面向对象的思想,掌握数据结构对逻辑思惟处理抽象能力有很大提高。。执行规则
、配合必定执行算法
所造成的高效的存储结构。在咱们所熟知的关系数据库、非关系数据库、搜索引擎存储、消息队列等都是比较牛的大型数据结构良好的运用。这些数据结构应用不只仅考虑到内存范围结构设计。还考虑实际os、网络等其余因素
。内存
中运行的抽象的数据结构
。是一个相对比较单一的数据结构类型,好比线性结构
、树
、图
等等.用户信息表users
html
id | name | sex |
---|---|---|
001 | bigsai | man |
002 | smallsai | man |
003 | 菜虚鲲 | woman |
users的pojo对象java
class users { //略 int id; String name; String sex; } //list和woman是数据 List<users>list;//数据对象list List<users>woman;//数据对象woman list.add(new users(001,"bigsai","man"));//添加数据元素 一个users由(001,bigsai,man)三个数据项组成 list.add(new users(002,"smallsai","man"));//数据元素 list.add(new users(003,"菜虚鲲","woman"));//数据元素 woman.add(list.get(2));//003,"菜虚鲲","woman"三个数据项构成的一个数据元素
用户输入
或者是自定义构造完成。固然,还有一些图像、声音也是数据。基本单位
。一个数据元素由若干数据项
构成!可认为是一个pojo对象、或者是数据库的一条记录。好比菜虚鲲
那条记录就是一个数据元素。id
、name
、sex
等,这些就是数据项.数据项是构成数据元素的最小不可分割字段
。能够看做一个pojo对象或者一张表(people)的一个属性/字段
的值。users
表、list
集合、woman
集合都是数据对象。单独一张表,一个集合均可以是一个数据对象。原子类型
:其值不可再分的类型。好比int,char,double,float等。结构类型
:其值能够再分为若干成分的数据类型。好比结构体构造的各类结构等。使用它的结构
而不用考虑它的实现细节
成为可能。好比咱们使用Arraylist。二叉树等等只须要new 一个而不须要去具体考虑他的内部实现方式。只须要了解他的api和性质便可。其实各个框架的思想也是这样,对数据、接口进行封装、继承使得咱们只须要会用而不须要弄清楚它的具体实现细节。逻辑关系
。逻辑结构分为线性结构
和非线性结构
。线性结构就是顺序表、链表之类。而非线性就是集合、树、图这些结构。顺序存储
、链式存储
、索引存储
和散列(哈希)存储
。定义
和实现
,运算的定义基于逻辑结构,运算的实现基于存储结构。容易混淆
的是逻辑结构与存储结构的概念。对于逻辑结构,不难看得出逻辑
二字。逻辑关系也就是二者存在数据上的关系而不考虑物理地址的关系。好比线性结构和非线性结构,它描述的是一组数据中的联系方式
和形式
,他针对的是数据。而存储结构就是跟物理地址挂钩的。好比一样是线性表
,可能有多种存储结构的实现方式。好比顺序表
和链表
(Arraylist,Linkedlist)它们的存储结构就不一样而且采用不一样存储结构在不一样场景计算机运算次数和效率不一样。它关注的是计算机物理地址与运行具体实现方式。有穷性、肯定性、可行性、输入、输出
。这些从字面意思便可理解。效率和空间资源占用
。一般复杂度更多描述的是一个量级
程度而不多用具体数字描述。程序员
概念:是对一个算法在运行过程当中临时占用存储空间大小的量度,记作S(n)=O(f(n))算法
空间复杂度其实在算法的衡量占比是比较低
的,可是不能忽视
空间复杂度中重要性。不管在刷题仍是实际项目生产内存都是一个极大额指标。对于java而言更是如此。自己内存就大,若是采用的存储逻辑不太好会占用更多的系统资源,对服务形成压力。数据库
而算法不少状况都是牺牲空间换取时间(效率)。就好比咱们熟知的字符串匹配String.contains()
方法,咱们都知道他是暴力破解,时间复杂度为O(n2),不须要借助额外内存。而KMP
算法在效率和速度上都原生暴力方法,可是KMP要借助其余数组(next[]
)进行标记储存运算。就用到了空间开销。再好比归并排序
也会借助新数组在递归分冶
的适合进行逐级计算。提升效率,而增长内存开销。api
固然,你的时间算法的空间花销最大不能超过jvm设置的最大值,通常为2G.(2147483645)若是开二维数组多种多维数据不要开的太大,可能会致使heap OutOfMemoryError
。数组
概念:计算机科学中,算法的时间复杂度是一个函数
,它定性描述了该算法的运行时间。这是一个关于表明算法输入值的字符串的长度的函数。时间复杂度经常使用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的状况。网络
时间复杂度的排序:O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) <O(n!) < O(nn)数据结构
常见时间复杂度:对于时间复杂度,不少人的概念是比较模糊的。下面举例子说明一些时间复杂度。架构
O(1): 常数函数
a=15
O(logn): 对数函数
for(int i=1;i<n;i*=2)
t
次使得i=n
;有2t=n; t=log2n,为log
级别时间复杂度为O(logn)。O(n): 线性函数
for (int i=0;i<n;i++)
O(nlogn):
for (int i=1;i<n;i++)
for (int j=1;j<i;j*=2)
O(n2)
for(int i=0;i<n;i++)
for(int j=0;j<i;j++)
固然若是一样是n=10000.那么不一样时间复杂度额算法执行次数、时间也不一样。
具体 | n | 执行次数 |
---|---|---|
O(1) | 10000 | 1 |
O(log2n) | 10000 | 14 |
O( n1/2) | 10000 | 100 |
O(n) | 10000 | 10000 |
O(nlog2n) | 10000 | 140000 |
O(n2) | 10000 | 100000000 |
O(n3) | 10000 | 1000000000000 |
结构优点
,好比树的查找,线段树
的动态排序等等。还有的是靠算法策略
解决,好比一样是排序,冒泡排序
的地位就略低,还有dp算法用动态发现规律解决问题。要想变得更快,那就得掌握更高级的数据结构和更精巧的算法。时间复杂度计算
时间复杂度计算通常步骤
:
两个规则:
并列
关系的执行语句那么取最大
的那个。T(n)=O(m)+O(n)=max(O(m),O(n))
;T(n)=O(n)+O(nlogn)=max(O(n),O(nlogn))
=O(nlogn)
;T(n)=O(m)*O(n)=O(mn)
T(n)=O(m)*O(m)=O(m^2)
(两层for循环)其余:
最优时间复杂度
(可能执行次数最少时),最坏时间复杂度
(执行次数最少时),平均时间复杂度
.这在后面的排序算法
会具体分析。固然,后面会一块儿学习一些常见的数据结构和常见的算法,进行复杂度剖析。至于绪论,就先介绍这些,下面会先介绍线性表和递归算法。
bigsai 关注回复 数据结构 便可获取精心准备的资料一份(精心)
原文出处:https://www.cnblogs.com/bigsai/p/11339123.html