常见数据结构与算法

常见数据结构

数组

数组是相同数据类型的元素按一定顺序排列的集合,是一块连续的内存空间。操作时间复杂度:查询、修改、求长度O(1),插入、删除、遍历O(n)。
优点:
1、按照索引查询元素速度快
2、按照索引遍历数组方便

缺点
1、数组的大小固定后就无法扩容了
2、数组只能存储一种类型的数据
3、添加,删除的操作慢,因为要移动其他的元素。

适用场景
频繁查询,对存储空间要求不大,很少增加和删除的情况。

int[] ints = new int[10];
ints[0] = 5;//set
int a = ints[2];//get
int len = ints.length;//数组长度

链表

  • 链表是一种非连续、非顺序的结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,链表由一系列结点组成。链表包括单链表、循环链表、双向链表和静态链表等。链表采用动态存储分配方式,需要时申请,不需要时释放。
  • 链表的优点是:add和remove操作时间上都是O(1)的;缺点是:get和set操作时间上都是O(N)的,而且需要额外的空间存储指向其他数据地址的项。
  • 空间性能方面,顺序表的存储空间是静态分配的,需提前确定其大小,更改的话容易造成浪费。适用于存储规模确定,不经常变更或变更不大的场合;动态链表是动态分配空间的,不容易溢出。适用于长度变化大的场合。但由于要存储指针,故空间利用率较低。
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("addd");//add
linkedList.set(0,"s");//set,必须先保证 linkedList中已经有第0个元素
String s =  linkedList.get(0);//get
linkedList.contains("s");//查找
linkedList.remove("s");//删除

栈(stack)是限定在尾部进行插入和删除操作的线性表。允许插入和删除操作的称为栈顶(top),另一端称为栈底(bottom)。因此,栈的操作是后进先出原则进行的。栈的基本运算包括:置空栈、入栈、出栈、取栈顶元素和判空。由于栈是受限的线性表,故可以由顺序表和链表来实现。

Deque<Integer> stack = new ArrayDeque<Integer>();
stack.push(12);//尾部入栈
int tail = stack.pop();//尾部出栈,并删除该元素
tail = stack.peek();//尾部出栈,不删除该元素

队列

队列也是受限的线性表。它只允许在一端插入,称为队尾(rear);另一端删除,称为对头(front),在队尾插入称为入队,对头删除称为出队。基本运算包括:置空队、入队、出队、取队头和判队空。它也可以由顺序表或者链表来实现。

Deque<Integer> integerDeque = new LinkedList<>();
// 尾部入队,区别在于如果失败了
// add方法会抛出一个IllegalStateException异常,而offer方法返回false
integerDeque.offer(122);
integerDeque.add(122);
// 头部出队,区别在于如果失败了
// remove方法抛出一个NoSuchElementException异常,而poll方法返回false
int head = integerDeque.poll();//返回第一个元素,并在队列中删除
head = integerDeque.remove();//返回第一个元素,并在队列中删除
// 头部出队,区别在于如果失败了
// element方法抛出一个NoSuchElementException异常,而peek方法返回null。
head = integerDeque.peek();//返回第一个元素,不删除
head = integerDeque.element();//返回第一个元素,不删除

集合

集合是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素,其主要特性是元素不可重复。

HashSet<Integer> integerHashSet = new HashSet<>();
integerHashSet.add(12121);//添加
integerHashSet.contains(121);//是否包含
integerHashSet.size();//集合大小
integerHashSet.isEmpty();//是否为空

常见算法

常见算法有查找和排序两种,其中查找是计算机数据处理经常用到的一种重要应用,当需要反复在海量数据中查找制定记录时,查找效率成为系统性能的关键。查找算法分为静态查找和动态查找,其中静态查找包括:顺序查找、二分查找和分块查找;动态查找包括:二叉排序树和平衡二叉树。此外还有理论上最快的查找技术——散列查找。这里只给出二分查找的代码。排序的目的是便于查找,比如电话号码查找、书的目录编排、字典查询等。常用的排序算法有:插入排序、冒泡排序、堆排序、选择排序和归并排序等.
常见的排序性能,如图:

posted @ 2021-03-18 08:38  苏洬  阅读(136)  评论(0编辑  收藏  举报