时间复杂度、数据结构

时间复杂度


空间复杂度:占用内存的多少
时间复杂度:算法运行时间随着数据规模的增长而增长的幅度
多少次的项
常数不管
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);

	
}
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值