北京的天气越来越凉了,秋天没啥感受呢,冬天就到来了。亲们,该穿秋裤穿秋裤哈!
咳咳...扯得有点远了,咱们还是言归正传,坚持每天学习一点知识,进步一点点。
做开发的同学大家对数据结构肯定是很熟悉的,不管是接触过关系型数据库的,非关系型数据库的,只要涉及到数据的操作,就免不了跟数据打交道。
可是,朋友,你真的理解,明白,懂数据结构吗?
数据结构是一门研究非数值计算的程序设计问题的操作对象,以及它们之间的关系和操作等相关问题的学科
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合
逻辑结构:
是指数据对象中数据元素之间的相互关系,其中今天我们最需要关注的问题,逻辑结构中的一下四种。
1、集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。各个数据元素是“平等”的。
2、线性结构:线性结构中的数据元素之间是一对一的关系
3、树形结构:树形结构中的数据元素之间存在一种一对多的层次关系
4、图形结构:图形结构数据元素是多对多的关系
物理结构(存储结构):
物理结构是指数据的逻辑结构在计算机中的存储形式
1、顺序存储结构:是吧数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。
我们实际应用中的数据就是一种顺序存储结构,声明数据的时候告诉它需要多大的空间,声明以后就会在内存中开辟出来一段连续的内存空间排放数据
2、链式存储结构:是吧数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。
数据元素的存储关系并不能反映其逻辑关系,因此呢需要用一个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。
很明显啊,链式存储比顺序存储灵活多了,数据存在哪里不重要,只要有一个指针存放了相应的地址就能找到它了。
经典算法:
上面呢我们简单的了解了下数据结构的基本概念,下面我们在实际算法当中使用一下。
我们可能都听说搞数学教高斯小学时候的一个故事,有一天,高斯的老师给大家出了一道数学题,要求大家计算出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越大,我们花费的时间会越多,效率会越来越低,性能会越来越差。
我们聊了这么多,那到底什么事算法呢?
算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令标示一个或者多个操作。
算法有什么特性呢?
1、输入输出:这个很容易理解吧,算法说白了就是计算么,它要有零个或者多个输入,至少一个或多个的输出,算法一定要有输出,如果没有输出,那算法还有什么意义
2、有穷性:指算法在执行有限的步骤以后,自动结束不会无限循环,并且每一个步骤在可接受的时间内完成。
3、确定性:算法的每一步骤都具有确定的含义,不会出现二义性
4、可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。
个人原创,欢迎拍砖!