数据结构就是数据的堆放方式(data structure)
(数据的组织、管理和存储格式) 目的 高效地存储和修改数据
算法就是计算的过程。
算法和数据结构相辅相成 数据结构是算法的基础
例子:排序算法中的堆排序,利用二叉树堆这样的数据结构。
缓存淘汰法LRU(Least Recently Used)最近最少使用。利用的哈希链表
衡量算法的两大标准是时间复杂度和空间复杂度
(通俗的讲就是代码运行完成所需要的时间和所占用的内存)
(时间复杂度就是执行程序的时间成本,空间复杂度就是执行程序的空间成本)
T(n)=3n 线性关系(时间复杂度)(执行完n次动作需要的时间) T(n) = O(n)
T(n)= 5n^2 T(n)= O(n^2)
用整数当key,使用次数当value,这样的数据结构叫做散列表(数据在内存中的存在形式)
空间复杂度
S(n)=O(f(n))
空间复杂度和时间复杂度是可以相互权衡的 多个数找重复数 时间是O(n^2)
空间是 O(n^2)(使用散列表)
算法是一系列程序指令,用来处理特定的运算和逻辑问题。
数据结构包括 数组 链表 (线性的数据结构)
树、图这样复杂的数据结构
数组和链表可以看作数据存储的“物理结构”
物理结构是人的肉身,逻辑结构是人的思想和精神.
栈: 它是一种线性的数据结构,就像一个放入乒乓球的圆桶,栈中的元素只能先入后出.
(保持先进后出的原则) 最早进入的叫做栈底,最后进入的叫做栈顶.
队列:队列就像隧道一样,是先进先出的.
循环队列可以解决普通队列容量不断减小的问题.
栈是先进后出 队列是先进先出 双端队列的数据结构结合了两个的优点.
优先队列不是先进先出,而是根据优先级来进行队列的控制.
散列表本质上也是一种数组(key value),(需要一个中转站 哈希函数)
在java中每一个对象都有自己的hashcode
index=hashcode(key)%Array.length (算出索引)
哈希冲突是不可避免的,我们有两种方式解决问题,一种是开放寻址法,一种是链表寻址法.
开放寻址法是遇到冲突就往后找一位,直到找到空的位置即可
链表寻址法":是冲突的位置和其它位置其实也是一个链表的头,来了冲突就插入对应的链表.
链表的扩容:
Capacity:是Hashmap当前的长度.
loadfactor:是hashmap的负载因子,默认值为0.75f
当hashmap.size>=Capacity*loadfactor
就要扩容.
扩容是创建一个entry的空数组,把原来hash的数据复制过来.