北京的天气愈来愈凉了,秋天没啥感觉呢,冬天就到来了。亲们,该穿秋裤穿秋裤哈!算法
咳咳...扯得有点远了,我们仍是言归正传,坚持天天学习一点知识,进步一点点。数据库
作开发的同窗你们对数据结构确定是很熟悉的,不论是接触过关系型数据库的,非关系型数据库的,只要涉及到数据的操做,就免不了跟数据打交道。数据结构
但是,朋友,你真的理解,明白,懂数据结构吗?性能
数据结构是一门研究非数值计算的程序设计问题的操做对象,以及它们之间的关系和操做等相关问题的学科学习
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合spa
是指数据对象中数据元素之间的相互关系,其中今天咱们最须要关注的问题,逻辑结构中的一下四种。设计
一、集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其余关系。各个数据元素是“平等”的。指针
二、线性结构:线性结构中的数据元素之间是一对一的关系code
三、树形结构:树形结构中的数据元素之间存在一种一对多的层次关系对象
四、图形结构:图形结构数据元素是多对多的关系
物理结构是指数据的逻辑结构在计算机中的存储形式
一、顺序存储结构:是吧数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。
咱们实际应用中的数据就是一种顺序存储结构,声明数据的时候告诉它须要多大的空间,声明之后就会在内存中开辟出来一段连续的内存空间排放数据
二、链式存储结构:是吧数据元素存放在任意的存储单元里,这组存储单元能够是连续的,也能够是不连续的。
数据元素的存储关系并不能反映其逻辑关系,所以呢须要用一个指针存放数据元素的地址,这样经过地址就能够找到相关联数据元素的位置。
很明显啊,链式存储比顺序存储灵活多了,数据存在哪里不重要,只要有一个指针存放了相应的地址就能找到它了。
上面呢咱们简单的了解了下数据结构的基本概念,下面咱们在实际算法当中使用一下。
咱们可能都据说搞数学教高斯小学时候的一个故事,有一天,高斯的老师给你们出了一道数学题,要求你们计算出1到100之内数的加和。一个一个加感受好累,高斯没有跟你们同样,他有本身的办法,分分钟就搞定获得结果:
咱们你们通常看到这个题目的时候,可能会这样写:
int sum =0 /*执行1次*/ for(var i=0;i<=100;i++){ /*执行n+1次*/ sum = sum + 1; /*执行n次*/ } console.log(sum) /*执行1次*/
这个计算的时间复杂度是 O(n) 线性阶
能够确定的是,上面这个能够获得正确答案,但是不够好,
高斯在这里就比咱们通常人聪明多了,咱们来看看高斯的思路:
sum = 1+2+3+...+99+100 sum = 100+99+...+3+2+1 2*sum = 101 * 100 int sun =0, n = 100; /*执行1次*/ sum = (1+n) * n/2 /*执行1次*/ console.log(sum); /*执行1次*/
这个计算的时间复杂度是 O(1) 常数阶
真的是没有对比就没有伤害啊,一样的结果人家的方法能够比咱们通常人的方法在执行上省却不少次运算,你们可能以为不就是100之内的求和吗,这两个时间也差很少啊。是的,但是若是是1000,10000,100000甚至更多呢,人家的无论多大的数值,都是只有三次运算就OK了,再看咱们第一次的方法,n越大,咱们花费的时间会越多,效率会愈来愈低,性能会愈来愈差。
咱们聊了这么多,那到底什么事算法呢?
算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,而且每条指令标示一个或者多个操做。
算法有什么特性呢?
一、输入输出:这个很容易理解吧,算法说白了就是计算么,它要有零个或者多个输入,至少一个或多个的输出,算法必定要有输出,若是没有输出,那算法还有什么意义
二、有穷性:指算法在执行有限的步骤之后,自动结束不会无限循环,而且每个步骤在可接受的时间内完成。
三、肯定性:算法的每一步骤都具备肯定的含义,不会出现二义性
四、可行性:算法的每一步都必须是可行的,也就是说,每一步都可以经过执行有限次数完成。
我的原创,欢迎拍砖!