今天学了一下数据结构和算法,数据结构和算法对于编程可谓是十分重要,数据结构和算法决定了这个程序员厉不厉害,一个优秀的算法可以让计算机的效率快好几百倍好几千倍,成指数级增长。好的算法是需要积累的,虽然说算法不能靠背,但是不背还真不行,起码一些很有名的算法,必须要掌握。企业的面试经常会有数据结构和算法题。在面试的之前,有一些东西可以提前几天背,完全可以完成面试,但是数据结构和算法却不可以,必须要懂得这个算法是怎么计算的。其实数据结构和算法有点类似于高数,高数好的人会觉得高数很简单,高数不好的人怎么都觉的难,一考试就是十几分,甚至二十几分。
数据结构和算法的内容还是很多的,想要短时间介绍完是不可能的,肯定是需要一个长期的积累的。今天先学了几个简单的数据结构概念
目录
1.时间复杂度
时间复杂度就是完成一个任务所需要的函数,这些函数的总的又可以组成一个新的函数,我们把他的一次项、系数等都去掉,只留下最高次方的那个函数。
举个例子:将一组数组从左向右依次遍历一遍,如果这个数最小那么就排到最左边,然后再从剩下的元素里选出下一个最小的元素,放到第二小的位置,以此类推,一共要选择N次
他的时间复杂度就是O(N^2)。
2,位运算
在计算机中有一个^,这个符号叫做异或,什么是异或呢,异或就是相同为零,相异为一.例如10就是1,01也是1,00是0,11是0.根据这个就可以写出位运算的时间复杂度
位运算的时间复杂度是O(N),
评定一个算法的时间复杂度,就是看这个算法的O()括号里面的数越小,那么算法就越优秀,减少计算机的计算次数,那么计算的速度就会变快,占用的内存就会跟少,所以看一个程序员能不能写出好的算法也是他的能力一部分。
3.冒泡排序
冒泡排序就是将n个数排序,先将第一个数和第二个数比较,如果第一个数大于第二个数就把第一个数和第二个数交换位置,然后下标从指向第一个数换成指向第二个,然后把第二个数和第三个数进行比较,如果第二个数比第三个数大就把第二个数放到后面,相邻的两个数进行比较如果左边的数比右边的大那么他就会和右边交换位置,如果数组是已经排好序的了,那么它的时间复杂度就是O(N)因为如果组数组已经是排好序的了,那么它只需要从12345……依次遍历一遍,所以它的时间复杂度就是O(N),如果它的顺序不同,那么可能就会是O(N^2),但是即使是这样,这种运算也比上面那个永远是O(N^2)的时间复杂度要低。
4.选择排序
选择排序就是将一组数组从左向右依次遍历一遍,如果这个数最小那么就排到最左边,然后再从剩下的元素里选出下一个最小的元素,放到第二小的位置,依次往下排,这是一种非常暴力的方法,所以它的时间复杂度也很高就是O(N^2),这也是在介绍时间复杂度的时候介绍的一种排序。
5.二分法
二分法就是一组数组,从左往右选取最中间的那个数,选取的这个数和你输入的那个数进行一次比较,如果输入的数大了或者小了,那么二分的范围继续缩小一半,不断的逼近那个要求的值,直到两个值相等,那么我们就找到我们要找的值,这种方法可能实施的时候代码比前几种方法的代码行数要多,但是这种方法可以让计算机的计算数目变小,比如需要计算一千万次把,那么计算机计算的速度会远远的大于方法,但是二分法并不适用于所有的情况,根据具体的情况选择合适的算法才是最重要的,二分查找法的时间复杂度是O(log以2为底N的对数)。
6.插入排序
插入排序就是一组数组,假设这组数组是2,3,4,2,5,6
那么先看2和3,因为2<3所以位置不变,再看234因为2<3<4,也不需要换,再看2,3,4,2,因为2<3所以把2插入3的前面,原来的数组就变成了2,2,3,4然后再继续做相同的工作,直至所有的数都经历了一遍,那么也就全部求完了O(N^2)
另外还要说一点,时间复杂度一般的都是计算最最坏情况,最优情况一般不做考虑,时间复杂度的平均值一般应用于工程问题,程序员需要的一般就是最坏的时间复杂度。