数据结构笔记1

来源:互联网 发布:三只松鼠旗舰店淘宝 编辑:程序博客网 时间:2024/06/03 15:09
数据结构

数据之间相互存在的一种或多种特定的关系的元素的集合


逻辑结构
数据对象中数据元素之间的相互关系

集合结构
线性结构
树形结构
图形结构

物理结构
顺序存储结构     (特征:美女来插队)
链式存储结构     (对不起,我是警察)

抽象数据类型
数据类型:一组性质相同的值的集合及定义在此集合上的一些操作的总称
抽象数据类型:一个数字模型及定义在该模型上的一组操作

线性表(List) -----ArrayList
a1是a2的前驱,ai+1 是ai的后继,a1没有前驱,an没有后继
n为线性表的长度 ,若n==0时,线性表为空表
个人信息表是个线性表

存储位置连续,可以很方便计算各个元素的地址
如每个元素占C个存储单元,那么有:
Loc(An) = Loc(An-1) + C,于是有:
Loc(An) = Loc(A1)+(i-1)*C;

链式存储方式线性表  LinkedList

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的

为了表示每个数据元素Ai与其直接后继数据元素Ai+1之间的逻辑关系,对数据元素Ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息

优:删除还插入效率高
缺:查询效率低

删除:
s->next=p->next
p->next=s;
插入
p->next=p->next->next

循环链表

将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相连的单链表称为单循环链表,简称循环链表

双向循环链表

双向循环链表是单向循环链表的每个结点中,再设置一个指向其前驱结点的指针域

双向循环链表插入

双向循环链表删除

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>,Deque<E>,Queue<e>,Cloneable,Serializable{private static final long serialVersionUID=8763232626451763541;transient int size=0;transient Link<E> voidLink;  //短暂的;路过的   头节点定义private static final class Link<ET>{ET data;Link<ET> previous,next;Link(ET o,Link<ET> p,Link<ET> n){data=o;previous=p;next=n;}}private static final class LinkIterator<ET> implements ListIterator<ET>{int pos,expectedModCount;final LinkedList<ET> list;Link<ET> link,lastLink;LinkIterator(LinkedList<ET> object,int location){list=object;expectedModCount=list.modCount;if(location>=0&&location<=list.size){link=list.voidLink;if(location<list.size/2){for(pos=-1;pos+1<location;pos++){link=link.next;}}else{for(pos=list.size;pos>=location;pos++){link=link.previous;}}}else{throw new IndexOutOfBoundException();}}}public void add(ET object){if(expectionModCount==list.modCount){Link<ET> next=link.next;Link<ET> newLink=new Link<ET>(objec,link,next);link.next=newLink;next.previous=newLink;link=newLink;lastLink=null;pos++;expectedModCount++;list.size++;list.modCount++;}else{throw new ConcurrentModificationException();}}public void add(int location,E object){if(location>=0&&location<=size){Link<E> link=voidLink;if(location<(size/2)){for(int i=0;i<=location;i++){link=link.next;}}else{for(int i=size;i>location;i--){link=link.previous;}}Link<E> previous=link.previous;Link<E> newLink=new Link<E>(object,previous,link);previous.next=newLink;link.previous=newLink;size++;}else{throw new IndexOutOfBoundsException();}}public E remove(int location){Link<E> link=voidLink;if(location<(size/2)){for(int i=0;i<=location;i++){link=link.next}}else{for(int i=size;i>location;i--){link=link.previous;}Link<E> previous=link.previous;Link<E> next=link.next;previous.next=next;next.previous=previous;size--;modCount++;return link.data;}throw new IndexOutOfBoundsException();}public Object[] toArray(){int index=0;Object[] contents=new Object[size];Link<E> link=voidLink.next;while(link!=voidLink){contents[index++]=link.data;link=link.next;}return contents;}}






LRU(Least recently used,最近最少使用)算法
主要使用LinkedHashMap 算法实现

双向循环链表插入

s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;

双向循环链表删除

p->prior->next=p->next;
p->next->prior=p->prior;

LinkhashMap  双向循环链表