算法与数据结构

简介: 算法与数据结构

大O描述的是算法的运行时间和输入数据之间的关系

O(1), O(n),O(lgn),O(nlogn),O(n^2)

n是nums中的元素个数

 

均摊复杂度和防止复杂度的震荡

栈也是一种线性结构


相比数组,栈对应的操作是数组的子集


只能从一端添加元素,也只能从一端取出元素


这一端称为栈顶


栈是一种后进先出的数据结构


Last in First Out(LIFO)

栈的实现:Stack<E>

void push(E)

E pop()

E peek()

int getSize()

boolean isEmpty()


栈顶元素反映了在嵌套的层次关系中,最近的需要匹配的元素

import java.util.Stack;

class Solution{

public boolean isValid(String s){

Stack<Character> stack = new Stack<>();

for(int i=0;i<s.length(); i++){

char c = s.charAt(i);

if(c == '(' || c =='[' || c == '{'){

stack.push(c);

}else{

if(stack.isEmpty()){

return false;

}else{

char topChar = stack.pop();

if(c == '(' && topChar != ')'){

return false

}

if(c == '[' && topChar != ']'){

return false

}

if(c == '{' && topChar != '}'){

return false

}


}


}

}


}

return stack.isEmpty();

}

队列 QUEUE

队列也是一种线性结构

相比数组,队列对应的操作是数组的子集

只能从一端(队尾)添加元素,只能从另一端(队首)取出元素

队列是一种先进先出的数据结构


First in First out


FIFO


队列的实现

Queue<E>

void enqueue()

E dequeue()

E getFront()

int getSize()

boolean isEmpty()


循环队列





什么是链表


线性数据结构



动态数组



队列

--------底层依托静态数组;靠resize解决固定容量问题


链表linkedList

public E e;

public Node nextElement;


数据存储在节点(Node)中

优点:真正的动态,不需要处理固定容量的问题

缺点:丧失了随机访问的能力


数组和链表的对比:

数组最好用于索引有语意的情况。array[2]

最大的优点:支持快速查询


链表不适合用于索引有语意的情况。

最大的优点:动态



程序调用的系统栈

递归调用时有代价的:函数调用+系统栈空间




二叉堆是一棵完全二叉树


二叉堆得性质:

堆中某个节点的值总是不大于其父节点



什么是Trie(字典树)--多叉树

每个节点有若干指向下个节点的指针


class Node{

boolean isWord;


Map<char,Node> next;


}


平衡二叉树(AVL树)


对于任意一个节点,左子树和右子树的高度差不能为超过1


平衡二叉树的高度和节点数量之间的关系也是O(logn)的二叉树


平衡因子:左子树的高度减去右子树的高度

左右节点的高度差



AVL树的左旋转和右旋转



加入节点后,沿着节点向上维护平衡性







什么是红黑树


1.每个节点或者是红色的,或者是黑色的

2.根节点是黑色的

3.每一个叶子节点(最后的空节点)是黑色的

4.如果一个节点是红色的,那么他的孩子节点都是黑色的

5.从任意一个节点到叶子节点,经过的黑色节点是一样的



2-3树

满足二分搜索树的基本性质

节点可以存放一个元素或者两个元素

每个节点有2个或3个孩子 ------ 2-3树

2-3树是一颗绝对平衡的树



红黑树和2-3树的等价性


所有的红色节点都是向左倾斜的

三个元素的节点会产生一个红色节点


(二三树中的三节点的左侧(较小的元素)为红节点)

其子节点为黑节点

黑节点的右侧子节点为黑节点


红黑树是保持“黑平衡”的二叉树





















 

标签: 算法与数据结构

目录
相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
90 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
37 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
2月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
40 4
|
2月前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
24 0
数据结构与算法学习十四:常用排序算法总结和对比
|
2月前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
37 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
2月前
|
机器学习/深度学习 存储 算法
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
|
3月前
|
机器学习/深度学习 算法 Java
[算法与数据结构] 谈谈线性查找法~
该文章详细介绍了线性查找法的基本概念与实现方法,通过Java代码示例解释了如何在一个数组中查找特定元素,并分析了该算法的时间复杂度。
|
2月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
2月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
27 0
|
2月前
|
存储 算法 Java
数据结构和算法--分段树
数据结构和算法--分段树
18 0