java,
java,
https://www.cnblogs.com/java1024/p/7685400.html
https://www.cnblogs.com/ysocean/p/6555373.html
http://www.cnblogs.com/mengfanrong/p/5079533.html
1.泛型
泛型就是类型化参数,包含泛型类,泛型接口,泛型方法。
静态方法不能使用泛型类中的变量,使用泛型方法。
https://www.cnblogs.com/coprince/p/8603492.html
2.三次握手,四次握手
https://blog.csdn.net/csdnnews/article/details/86570658
3.java集合类图
集合类图:http://www.cnblogs.com/mengfanrong/p/5079533.html
底层实现:https://blog.csdn.net/qq_25868207/article/details/55259978
框架详解:https://www.cnblogs.com/CarpenterLee/category/828184.html
hashmap和linkedhashmap比较:https://www.cnblogs.com/jijijiefang/articles/7189837.html
hashmap和hashset使用哈希表提高查询效率,针对hash表的hash算法和冲突后的处理
https://www.cnblogs.com/guweiwei/p/6945700.html
tree数据结构:
https://blog.csdn.net/AllenWells/article/details/77855045
http://blog.jobbole.com/111680/
对树的理解:
二叉树,本质上,是对链表和数组的一个折中。。
比如,我有一个任务,需要输入
10万个数据(32位整数),然后有两个操作:
1.添加(删除)一个整数。
2.询问第x大的数据。
比如,我给你 1, 8, 13, 10(等等一堆数据).......
然后我询问第3大的数据,
然后我插入 18
然后我询问第4大的数据
我再插入 9
我再询问第2大的数据
不停的重复1,2
重复10万次。。
应该如何实现。
你会发现,用有序链表,不行,查找(包括1需要找到对应位置,以及2查找)成本大O(N),但具体这个插入操作成本小O(1)。
用有序数组,查找(2的查找)成本小O(1)。但1的插入操作成本很大O(N)。
所以,我们折中使用排序二叉树(二叉树仅仅作为排序二叉树的基础),查找(包括1需要找到对应位置,以及2查找)成本挺小O(logN)。具体这个插入操作成本也挺小O(logN)。
具体的应用就是由排序二叉树(由于普通排序二叉树可能会有不平衡的情况)引申出来的红黑树(linux中ext3文件系统管理),avl树“windows对进程地址空间的管理”。
建立在如下推论上:假定把数组看成N叉树,那么链表就是1叉树,由于数组只有1层,二叉树有logN层,而链表有N层,"logN对1" 以及 "N对logN" 都是 无限大的关系。。。相当于我们在1 ~ N之间找了一个logN作为两者的折中。。。。。。
进一步的脑洞是,如果我们是a叉树,那么结果就是层,但
考虑分母部分。
- a = 1时,log(2)1 = 0
- a = 2时,log(2)2 = 1
- a = N时,log(2)N = N
恰好构成了 0, 1, N的三个经典数字。。。。
查找和插入一共所需的次数可以简化为:每层数量+总层数 = 当a是大于等于1的整数时,a取2是最划算的。。。所以综合以上推断,个人得出,"二叉树,本质上,是对链表和数组的一个折中"。 这对于查找和插入是类似1:1(同一数量级)的需求,用二叉树(排序二叉树等)是很划算的。如果不是同一数量级可以考虑,增大a或者减少a,具体问题具体分析,这是个工程问题。得考虑编码难度,算法常数,可维护性等多方面需求。不再一一分析
相关文章
- 暂无相关文章
用户点评