为什么要学习数据结构与算法
使用合适的数据结构和算法进行优化程序,可以使得你的程序运行的更快,
并且占用更少的资源,有益于开发大型程序
也就是说它会从时间复杂度和空间复杂度两方面进行分析,时间复杂度关注的是效率,空间复杂度关注的是资源利用率。在特定的场景下用特定的数据结构和算法进行优质的开发,这样可以从时间上和资源占用量上都达到一个非常好的效果。“有益于大型程序的开发”,这句话什么意思呢?以为我们在进行比较复杂的程序中,我们会涉及到一个大的数据量比较复杂的处理逻辑,几个例子:现在有1万条数据,每处理一条数据需要经过10个链式函数(a掉b,b调c,c又可能调d)的调用,A同学开发出来一个程序,它每处理一条数据用时1毫秒,这是相当快了,在这种大频度的调用下,只需要1毫秒,B同学开发了一套程序,需要两毫秒去处理一条数据,那么对比A和B两个同学所研发的这套程序呢,其实没有什么太大的区别,1毫秒和2毫秒对我们来说都是眨眼之间转瞬即逝的,但是我们来计算下数据量,我有1万条数据,每处理一条B就比A慢了1毫秒,那么1千条,那么B就比A慢1秒中,1万条就慢10秒钟,1秒钟对我们程序员来讲都是相当少,但是我们可以看到每一条数据少1毫秒就会出现1万条数据慢10秒的差距,对于一个用户来讲5秒以内是我们用户等待的一个极限,超过5秒之后会给用户一个好慢的印象,所以说可以有益于开发大型程序,它可以优化我们。每一个节点进行优化,每一个节点少一点点时间,在大数据的情况下,它就会少很多时间。
高级工程师和普通工程师区别就在于高级工程师他所开发的代码,质量和效率都是要优于普通工程师的。普通工程师每天都用foreach for循环,高级工程师他会在合适的地方选择合适的数据结构,而不是盲目的去选择一个hashMap或者一个ArrayList。
Java 数据结构是什么?
数据结构是对在计算机内存中的数据的一种安排。
包括数组,链表,栈内存,二叉树,红黑树,哈希表等
了解数据结构和算法,可以秒杀水代码,冲击高薪职位。
(初级)数据结构 | 优点 | 缺点 |
---|---|---|
数组 | 插入快,如果知道下标,可以快速的存取 | 查找慢,删除慢,大小固定 |
有序数组 | 比无序的数组查找快 | 删除和插入慢,大小固定 |
栈 | 提供后进先出方式的存取 | 存取其它项很慢 |
链表 | 插入快,删除快 | 查找慢 |
二叉树 | 查找,插入,删除快(前提是树保持平衡) | 删除算法复杂 |
(高级)数据结构 | 优点 | 缺点 |
---|---|---|
红-黑树 | 查找,插入,删除快(树总是平衡的) | 算法复杂 |
2-3-4树 | 查找,插入,删除快(树总是平衡的) | 算法复杂 |
哈希表 | 如果关键字已知则存取极快。插入快 | 删除慢,如果不知道关键字则存取很慢,对存储空间使用不充分 |
堆 | 插入删除快,对大数据项的存取很快 | 对其它数据项存取慢 |
图 | 对现实世界模拟 | 有些算法慢且复杂 |
大O表示法表示算法性能
概念:
大O表示法的实质并不是对运行时间给出实际的值,而是为了表达运行时间是如何受数据项个数所影响的。
O的含义:
大写字符O,可以认为其含义是“order of ”(大约是)。
那为什么没有精确的值呢?我们看下面这张图
- 我们倒着看,先看O[n!] (n的阶乘,123…n),这是最慢最慢的一个时间复杂度,看横轴elements(数据量)随着增加,它的运行时间几乎成直线向上攀升,也就是说会数据量增加会越来越慢,处理一个数据要1秒,处理5个数据就要1234*5=120秒,这种算法对我们来说极为不可取。
- 再看倒数第二的O[2^n] (2的n次方),其实比n的阶乘好不了多少,比如说处理一条数据用2秒,处理5条数据就是2^5 =32秒,这时间上升速度也是相当快的。
- 我们看看O[n^2] (n的平方),就是图中第三条数据,它就相对平缓的增长,也就是说处理一条数据需要1秒的话,处理10条数据我需要100秒,这就是它的大概的计算方式,当然是order of 大约的
- 我们看看O[nlogn],第四条线,它的增长相对更加平稳一些,如果我们处理一条数据的话,是n的log1,如果处理100条数据是100log100,这样的话在数学的函数表示上,它的增长会稍慢些,也就说是我们大O表示法其实是随着这个个数所影响的这个时间。
- 我们来看下更好些的O(n),也就是说100条数据用100秒,1000条数据用1000秒,10000条数据用10000秒,这个是比N倍的logn更好一级别的,是成横轴纵轴是1对1的比例上升
- O[logn]它比nlogn少一个n,这更好一些,更加平缓。
- O[1],我们说大O表示法是时间被数据项个数所影响的,那么O[1]是什么意思?也就是说不管是1千条,1万条,甚至是1亿条都不会影响我们的处理效率,它的时间复杂度一直是维持在1这一块,也就是非常的快,你有多少条数据,我都没有问题,都不会影响我的处理速度。目前来说,O[1]是最快的时间复杂度算法。栈和队列都可以达到O[1],不管有多少数据,只要它存的下,我就可以用O[1]的速度把它取出来,以最快的速度把它取出来。