时间复杂度
空间复杂度:占用内存的多少
时间复杂度:算法运行时间随着数据规模的增长而增长的幅度
多少次的项
常数不管
N为输入规模
o(1):若对于一个算法的上界与输入大小无关,则称其具有常数时间
字典和集合的存取时间是
数组的存取
链表的删除、插入
o(logN):有序数组二分法查找,常见的具有对数时间的算法有二叉树的相关操作和二分搜索。
o(N):
取数组所有的和、数组插入和删除
链表的读取
O(MlogN)
——————————————
数据结构
数组:连续存储
链表:不连续存储,存储数据和下一个结点的位置
栈:先进后出,相当于桶
队列:先进先出,相当于排队
字典:
把字符串转为数字作为下标存储在数组中
字符串转为数字的算法:hash哈希o(1)
字典的存取都是o(1)
hash:
1. 确定数据规模,这样可以确定容器数组的大小 size
2. 把字符当作 10 进制数字得到结果
- 'gua' 被视为 g * 1 + u * 10 + a * 100 得到结果 n
- n % size 作为字符串在数组中的下标
- 通常 size 会选一个 素数
二叉搜索树:
左子树所有节点的值都<根节点的值
右子树所有节点的值都>根节点的值
平衡:
高度(一共有几层)
左子树和右子树的高度差<=1,则平衡
平衡二叉搜索树:
在插入、删除的时候都要保持平衡,即旋转
红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能
图:
地图导航
全国几大城市之间的出行方案
——————
实现
栈(链表)
push:放
pop:拿
top:栈顶元素
GuaStack{
Node head;
构造
}
每次插入元素都要放在靠Head那头
队列(链表)
GuaQueue{
Node head;
Node tail;
构造
{
this.head=new Node();
this.tail =head;
}
从tail进,从head出
head是个结点,tail是个指针
HashMap
(数组+链表)
数组里存链表,链表第一个为Key,第二个为value
HashMap{
private ArrayList<ArrayList<String>> list;
private int _size;//内部用
private int length;//当前存了多少数据
HashMap(){
_size = 17;
list = new ArrayList();
......
}
Integer hash(String key){
int hashResult = 0;
int jinwei = 1;
for(int i = 0; i < key.length(); i++) {
char c = key.charAt(i);
int n = c*jinwei;
hashResult = hashResult +n;
jinwei = jinwei *10;
}
if(hashResult < 0){//计算到正数的最大值,溢出,变为负数
hashResult = -hashResult;
}
Integer index = hashResult % _size;
return index;
}
void push(String key,String value) {
Integer index = this.hash(key);
ArrayList<String> l = this.list.get(index);
}
}