集合、数据结构、时间复杂度
1、集合
1.1 概述
java集合分为三种类型,List、set和Map。List有序,可以重复。Set无序不重复。Map是Key-value对类型,其中Key具有set的特点。
1.2 List
List java中有ArrayList和LinkedList两种实现。
ArrayList
通过数组来实现,擅长读操作,有容量概念,扩容发展50%。
LinkedList
内部通过链表实现,通过指针实现,检索的对象时从两头检索,看索引位于哪个半段范围中。内部存放了首尾两个节点,元素通过node连接在一起。Node由item 、 prev、 next构成,检索最坏情况不会超过半数。
性能评测
Arraylist LinedList 结论 写(100w) 90,255ms 40ms 200x 读(5wth) 0.036,538ms 0.637,157ms 20x
1.3 Map
map是通过key-value关联起来的映射构成的集合。其中key具有set的特点。java中Map有HashMap和TreeMap。
HashMap
内部通过数组+链表实现。
class HashMap{ // transient Node<K,V>[] table; // static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; } }
TreeMap
内部通过红黑二叉树实现。
put过程分析put(K key, V value){
//
//hash(key)取出key的新hash值。
//
return putVal(hash(key), key, value, false, true);
}//新hash的计算方式使用key的旧hash的高16位和低16位做异或运算。
//移位运算的目的是让更多的特征值参与计算。
//异或运算的目的是让值更加分散。
//默认分配16个桶,
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);//hashmap中判断key是否存在的算法:
(e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))//新哈希不等
if(新哈希不等?){
//key不等
}
//相等
else{
if(是否是同一key?){
存在
}
else{
if(key是否equals?){
存在
}
else{
不同
}
}
}
数据结构
数组 //[]
链表 //通过引用关联实现
Stack //先进后出, push | pop,通过list实现
队列 //先进先出,enqueue ,通过list实现
Map //数组 + 链表(引用)。
Tree //树形.
[红黑树]
1.节点有颜色(红|黑)
2.根式黑色的
3.所有叶子是黑色的
4.节点为红,孩子为黑
5.节点到可达的叶子节点都有相同数量的黑色节点.
如果出现歪楼的情况,就会进行旋转,歪到左边就右旋,歪到右边就左旋。
/**
定义key
*/
public class MyKey {
int n ;
public MyKey(int n){
this.n = n ;
}
public int hashCode() {
return n;
}public boolean equals(Object obj) {
return false ;
}
}
//测试hashMap
@Test
public void testMap(){
Map<MyKey,String> map = new HashMap<MyKey, String>() ;
map.put(new MyKey(0), "1") ;
map.put(new MyKey(16), "2") ;
map.put(new MyKey(32), "3") ;
System.out.println(map.size());
}
时间复杂度
xxx = 3N^3 + 2n^2 + 5n
O(n^3)
byte[] aa = new byte[n] ;
aa[0] ; = O(1)
for(){
}
O(n)
for(int i = 0 ; i < arr.length ; i ++){
sum = sum + arr[i] ;
...
}
HashMap的时间复杂度:
1.最好情况
O(1)
2.最差情况
O(n)
练习
1.冒泡排序时间复杂度
[最差]
n^2 - n
1 + 2 + 3 + .. + n - 1 = ----------- = O(n^2)
2
[最好]
O(n)
作业
设计一个类Person含有height、weight、age和blood是整数属性。
实现hashcode方法,将四个属性编排到一个整数中作为hashcode.
折半查找的时间复杂度问题
99乘法表的时间复杂度
两个n阶方阵的乘积的时间复杂度
红黑树依次存放1,2,3,4,5做key,给出树结构
put(1,"x"); put(2,"x"); put(3,"x"); put(4,"x"); put(5,"x")