合集-数据结构与算法
摘要:选型 我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位 , 那么有多少个基本操作就代表会花费多少时间单位 , 由此可以忽略机器环境的影响而客观的反应算法的时间效率 代码执行总时间(T) = 操作步骤数量 * 操作步骤执行时间(忽略机器环境的影响) 算法时间复杂度是用来描述算法在运行时所
阅读全文
摘要:1. 数据结构 存储、组织数据的方式 包括数组、链表、堆、栈、队列、树、图等 同样的数据不同的组织方式就是数据结构。比如对老王的姓名、年龄、性别的描述: 列表方式:[老王,18,男] 字典方式:{name:"老王",age:18,sex:"男"} 而列表、字典都可以存储了老王的数据,但按照不同的方式
阅读全文
摘要:1. 什么是空间复杂度? 算法的时间复杂度和空间复杂度合称为算法的复杂度 它表示算法所使用的额外空间随着输入规模增加而增加的速率 2. 空间复杂度可以通过以下方式进行分析: O(1) - 常数空间复杂度: 示例: 只使用固定数量的额外变量或常量大小的数组。 最佳实践: 常数空间复杂度是最理想的情况,
阅读全文
摘要:1. 什么是数组?(python中的列表) 分类:线性表(Linear List)。在内存中体现为一段连续的空间。在Java、Python、Javascript有共同点,也有不同点。 2. 数组/列表的特点 根据下标访问是O(1),其他访问是O(n)--遍历 修改是O(1)(根据下标修改) 删除、插
阅读全文
摘要:说明 链表是数据结构中的线性结构,用于存储一系列元素(节点),其中每个元素都包含一个指向下一个元素的引用。 链表由一组节点组成,每个节点包含两个部分:数据和指向下一个节点的指针(或引用)。 线性结构中对比数组/列表的优势:插入和删除性能较好 涉及的概念: 1. 节点:节点包括2个域,元素域、链接域
阅读全文
摘要:1. 什么是栈? 栈是一种常见的数据结构,它遵循先进后出(LIFO)的原则。栈可以用来解决很多实际问题,比如函数调用、表达式求值、括号匹配等。 一般使用数组、链表实现栈 2. 特点 栈是一种线性数据结构,由一系列元素组成。 栈的插入和删除操作只能在栈的顶部进行。 栈的顶部元素是最后一个插入的元素,也
阅读全文
摘要:N-皇后问题是一个经典的计算机科学和数学问题,其目标是在一个N×N的棋盘上放置N个皇后,使得它们彼此之间互不攻击,即没有两个皇后在同一行、同一列或同一斜线上。 这个问题最早由卡尔·弗里德里希·高斯于1850年提出,它在计算机科学领域中被广泛研究,被用作算法和人工智能的基础问题。 问题描述 给定一个N
阅读全文
摘要:说明 算术表达式的表示法有多种,其中最常见的包括中缀表达法、前缀表达法和后缀表达法。这些表示法用于表示和求解数学表达式,它们在计算机科学和数学领域都有广泛的应用。 中缀表达法、前缀表达法和后缀表达法是操作符的位置来分类的。操作符位于2个操作之间叫中缀表达法,操作符位于2个操作数之前叫前缀表达法。操作
阅读全文
摘要:概念 前序表示法,也称为前缀表示法或波兰表示法(Polish notation),是一种用于表示数学表达式和算术运算的方法。这种表示法的特点是将运算符置于操作数之前,而不是像传统的中缀表示法(例如,2 + 3)将运算符置于操作数之间。前序表示法具有一些优点,尤其在计算机科学和计算器设计中非常有用。下
阅读全文
摘要:概念 后序表示法(Postfix Notation)又称为逆波兰表示法(Reverse Polish Notation,RPN),是一种用于表示数学表达式的方法,其中运算符位于它们的操作数之后。 这种表示法非常适合用栈来计算表达式的值,因为它消除了括号的需求,使计算机能够轻松地理解和求解表达式。 例
阅读全文
摘要:1. 什么是队列? 队列是一种特殊的线性表,一般只允许在队列的两端进行操作,队列前端进行删除操作,队列的末尾进行添加操作(双向队列的前端、末尾都可以进行删除、添加操作)。 队列可以用数组或链表实现。主要有两个指针:一个front指向队首元素,一个rear指向队尾元素。 2. 队列常见操作 队列常用的
阅读全文
摘要:循环队列 又称为环形队列,有如下4个特点: 在循环队列的定义中规定了两个索引指针:front 和 rear。front 指向第一个有效元素的位置,而rear 可以理解为用来记录队尾元素的下一个位置。 当队列为空时,front == rear; 当队列满时,(rear + 1) % n = front
阅读全文
摘要:概念 双向队列(Double-ends Queues简称Dequeue)是一种前后2端都可以添加数据(入队)、移除(出队)数据的有序线性表。 特点 双向队列(Deque,全名Double Ended Queue)是一种具有两个指针的线性表,允许从两端都可以进行插入和删除操作即双向队列可以在任意一端进
阅读全文
摘要:什么是树结构? 树(Tree)是一种具有层次性的非线性数据结构。它是由一个或多个节点(Node)组成。每个节点由数据和指针组成。存在一个特殊的节点称为根节点。 除了根节点,其余节点可分为n个互斥的集合,每个集合本身也是一个树结构。 其中A是树根节点,其子节点B、E、K又可以分为3个集合: 第1个集合
阅读全文
摘要:什么是二叉树(binary tree)? 在树结构的基础上,要求其中每个节点最多有两个子节点(一个节点最多有2个边)。 二叉树由根节点和若干个左子树和右子树构成,这些子树也都是二叉树。二叉树可以为空树,也可以只包含一个根节点。 为什么树形结构常用二叉树呢? 就是为了省空间。n叉树,n越大就需要更多的
阅读全文
摘要:赫夫曼树概述 HuffmanTree因翻译不同导致其有多个名字:赫夫曼树、霍夫曼树、哈夫曼树 赫夫曼树又称最优二叉树,是一种带权路径长度 最短的二叉树。 所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。 树的路径长度
阅读全文
摘要:存储方式 一般使用数组、链表来存储树(节点)。链表的优点就是添加、删除。数组优点是访问(遍历)。 一维数组表示法 首先将二叉树当作一颗满二叉树(Full Binary Tree),因此第K层具有2k-1 个节点。按照规则存放在一维数组中。 原理 对于一个具有n个节点的二叉树,可以使用一个长度为2n的
阅读全文
摘要:Java Java中可以使用链表来实现二叉树的存储。 1. 链表实现二叉树的原理: 链表是由节点组成的数据结构,每个节点包含一个数据和指向下一个节点的指针。 在链表中,可以将二叉树的每个节点都看作一个链表节点,同时维护一个指向左子节点的指针和一个指向右子节点的指针。通过这种方式,可以将二叉树的各个节
阅读全文
摘要:二叉树遍历的规则 1. 根据根节点(父节点)的位置在最前面、在左子节点、右子节点中间、最后面,分为前序、中序、后序。 2. 除了根(父节点)特殊以外,都是先左节点、后右节点。 前序遍历 1. 一个子树一个子树的看 2. 前序:根(父)--> 左子节点 >子树 ..... -->右子节点 第1个子树:
阅读全文
摘要:什么是二叉运算树 二叉运算树(Binary Expression Tree),也称为二叉表达式树,是一种数据结构,用于求解数学表达式或算术表达式。它是一种二叉树,其中每个节点表示一个操作符或操作数,并且具有以下特点: 叶子节点(没有子节点)表示操作数,如整数或变量。 内部节点表示操作符,如加法、减法
阅读全文