数据结构

LeetCode丨刷题历程及总结

感情迁移 提交于 2020-02-06 01:07:31
历程 花一周左右阅读了 Problem Solving with Algorithms and Data Structures Using Python ,用Python实现各类数据结构和算法。此书的 中文版 。 2019/11/26-2020/2/2,开始刷LeetCode,按标签,通过率从高到低开始,完成218题,对标签重新归纳。 接下来整理之前做过的题目,归纳知识点和模板,还未开始。 标签整理 数据结构 数组 字符串 链表 树 字典树/二叉搜索树 线段树/线状数组 栈/队列 堆 图 拓扑排序 哈希表 并查集 算法 查找 二分查找 排序 快排 堆排序 贪心算法 DFS/BFS 动态规划 递归/回溯/记忆化 分治 双指针/滑动窗口/Line Sweep 其他 设计 数学/几何/脑筋急转弯 位运算 随机/蓄水池抽样/Rejection Sampling Ordered Map/极小化极大 来源: https://www.cnblogs.com/vincent1997/p/12267478.html

数据结构与算法概念

扶醉桌前 提交于 2020-02-06 00:27:49
数据结构小白入门 数据结构指一组相互之间存在一种或多种特定关系的数据元素的集合, 当我们需要在计算机中存储这些数据时,还涉及到数据的,组织方式,在计算机中的存储方式,以及定义在该数据上的一组操作; 一组数据相互之间有某种关系 组织方式 存储方式 以及可对其进行的一组操作 理解: 我们学习的最终目的是要在计算机中存储 一组数据 ,但是不得不先考虑数据的 组织方式 ,在计算机中的 存储方式 ,以及可以对这些数据进行的 一组操作 ,当然了既然是一组数据必然表明了这写数据之间是存在想换的关联关系的;关系可能还会有多种; 例如: 一组数据:12345 组织方式:从小到大 存储方式:可使用线性存储结构 操作:要取出最大的一个 数据结构研究方向 问题: 机外处理 处理要求 建模: 逻辑结构 基本运算 实现: 存储结构 算法 基本术语 数据(Data): ​ 所有能被计算机处理的符号的集合 数据元素(DataElement): ​ 是数据集合中的一个 个体,即数据的基本单位 数据项(DataItem): ​ 数据元素常常可分为若干个数据项,数据项是数据具有意义的最小单位 组织数据的三个层次: 数据(表)->数据元素(行)->数据项(字段) 实际问题中的数据成为原始数据 逻辑结构(LogicalStructure) ​ 数据元素之间的结构关系,如从小到大/一对一/一对多 物理结构

数据结构(背包、队列和栈)

前提是你 提交于 2020-02-06 00:21:59
一.背包   背包是一种不支持从中删除元素的集合数据类型,目的是帮助用例收集元素并迭代所有收集到的元素,也可以检查背包是否为空,或者获取背包中元素的数量。背包里面的元素的顺序不确定。   要理解背包的概念,可以想象一个喜欢收集弹珠球的人。他将所有的弹珠球都放在一个背包里,一次一个,并且会不时在所有的弹珠球中寻找某一颗;    1.用链表实现 import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; import java.util.Iterator; import java.util.NoSuchElementException; public class Bag<Item> implements Iterable<Item> { private Node<Item> first; private int n; private static class Node<Item> { private Item item; private Node<Item> next; } /** * Initializes an empty bag. */ public Bag() { first = null; n = 0; } public boolean isEmpty() { return first

【数据结构】---线性表

℡╲_俬逩灬. 提交于 2020-02-05 19:57:44
目录 线性表的定义和特点 线性表的顺序表示和实现 线性表的顺序存储表示 顺序表中基本操作的实现 1. 初始化 2. 取值 3. 查找 4. 插入 5. 删除 线性表的定义和特点 线性表属于线性结构。 线性结构的基本特点是除第一个元素无直接前驱,最后一个元素无直接后继之外,其他每个元素都有一个前驱和后继。 同一线性表中的元素必定具有相同的特性,即属于同一数据对象,相邻数据元素之间存在着序偶关系。 由 \(n (n \geq 0)\) 个数据特性相同的元素构成的有限序列称为 线性表 。线性表中元素的个数 \(n (n \geq 0)\) 定义为线性表的长度, \(n = 0\) 时称为空表。 线性表的顺序表示和实现 线性表的顺序存储表示 线性表的顺序表示是指用一组地址连续的存储单元一次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构,称这种存储结构的线性表为**顺序表 (Sequential List)。逻辑上相邻的元素,物理次序也是相邻的。 线性表的第一个数据元素的存储位置,通常称作线性表的起始位置或 基地址 。线性表的顺序存储结构是一种 随机存取 的存储结构。 通常使用数组来描述数据结构中的顺序存储结构,由于线性表的长度可变,在C语言中可用动态分配的一维数组表示线性表,描述如下: // ----------顺序表的存储结构---------- #define MAXSIZE

数据结构之线性表的实现

风格不统一 提交于 2020-02-05 19:45:58
线性表的定义 在生活中其实处处可见线性表的例子。比如一个班级的小朋友,一个跟着一个排着队,有一个打头,有一个收尾,当中的小朋友 每一个都知道他前面一个是谁,他后面一个是谁,这样如同有一根线把他们串联起来 了。 就可以称之为线性表。 所以线性表的定义为:零个或多个数据元素的有限序列。 首先它是一个序列。 也就是说, 元素之间是有顺序的 ,若元素存在多个,则第一 个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。 然后, 线性表强调是有限的 ,小朋友班级人数是有限的,元素个数当然也是有限的。 线性表的抽象数据类型 那么定义好的线性表应该具有哪些操作呢?还是以前面排好队的小朋友举例子,我们可以知道这个队伍的长度,也可以找出队伍里的某个小朋友,有时我们还需要知道队伍里有没有一个叫小明的同学,这种查找某个元素是否存在也是线性表的必要操作。对于一个幼儿园来说,加入一个新的小朋友到队列中,或因某个小朋友生病,需要移除某个位置,也是很正常的情况,因此对于一个线性表来说,插入数据和删除数据都是必须的操作。所以我们可以定义这样一个线性表的抽象数据类型。 类型名称:线性表(List) 数据对象集:线性表是 n (≥0)个元素构成的有序序列( a1, a2, ...,an ) 操作集:线性表L List,整数i表示位置,元素X  ElementType, 线性表基本操作主要有: 1

数据结构 | 如何实现线性表的顺序结构

别来无恙 提交于 2020-02-05 19:26:29
什么是线性表 线性表就是零个或多个数据元素的有限序列。 首先是一个序列,然后序列之间有顺序,序列中的元素如果存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且一个前驱和一个后继。 什么是线性表的顺序存储结构 线性表的顺序存储结构就是用一段地址连续的存储单元依次存储线性表的数据元素,也就是用数组去实现顺序存储结构。 下面用代码实现一下顺序结构。 首先写一个接口 接口主要描述一下实现类要实现哪些方法,这里顺序结构包括三个方法,分别是获得元素,插入元素以及删除元素的方法。 package com.stucture.sqlList; /** * 线性表顺序存储结构的接口 * 指的是用一段地址连续的存储单元存储线性表的数据元素 * @ClassName: ISeqList * @author cier * @date 2018-1-22 */ public interface ISeqList<T> { /** * 获得元素 * @param i 需要获得第i个元素 * @return */ public T getElem(int i); /** * 插入元素 * @param i 元素的插入位置 * @param t 需要插入的元素 * @return 是否成功删除 */ public boolean insertElem(int i,T t); /** * 删除元素

【Python数据结构与算法复习day37】1-01-算法引入+“如果 a+b+c=1000,且 a^2 + b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?不允许依赖任何”

元气小坏坏 提交于 2020-02-05 19:11:00
Python数据结构与算法 1-01-算法引入 文章目录 Python数据结构与算法 1-01-算法引入 为什么要学习数据结构与算法? 面试题 解答 枚举法 思路 代码实现 结果 记录时间的代码实现 说明 算法的定义 推荐图书 算法的五大特性 为什么要学习数据结构与算法? 因为算法即兵法,是基本功,要不断地主动学习与积累 面试题 如果 a+b+c = 1000,且 a^2 + b^2 = c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?不允许依赖任何数学公式 解答 不依靠数学公式,我们靠枚举法 枚举法 思路 a=0 b=0 c=0 a=0 b=0 c=1 a=0 b=0 c=2 a=0 b=0 c=0~1000 a=0 b=1 c=0~1000 这样手工也可以解答出 如果题目改成 如果 a+b+c = 2000,且 a^2 + b^2 = c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?不允许依赖任何数学公式 这样的枚举法也是基于实现的 以上就是一个枚举法的思路 程序怎么来写呢 代码实现 # 如果 a+b+c=1000,且 a^2 + b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?不允许依赖任何数学公式 # a # b # c for a in range ( 0 , 1001 ) : for b in range (

索引

旧街凉风 提交于 2020-02-05 18:54:07
索引的三个特征: 1,索引高度很低 2,索引有序 3,索引存储索引列的值 索引是帮助mysql高效获取数据的排好序的数据结构 索引的数据结构 二叉树 红黑树 Hash表 B-Tree https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 来源: CSDN 作者: Michael_lcf 链接: https://blog.csdn.net/Michael_lcf/article/details/104185009

数据结构--图(中) 最短路径、Dijkstra、Floyd、旅游规划

僤鯓⒐⒋嵵緔 提交于 2020-02-05 16:55:02
最短路径问题 最短路径问题的抽象 在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径。 这条路径就是两点之间的最短路径 第一个顶点为源点 第二个顶点为终点 问题分类 单源最短路径问题:从某个固定源点出发,求其到所有其他顶点的最短路径: 1. 无权图 2.有权图 多源最短路径问题:求任意两顶点间的最短路径 无权单源最短路径算法 --BFS 按照递增的顺序找出到各个顶点的最短路,从而算出到终点的最短路。也可以想象为权值为1的有权单源最短路问题,解决这类问题最好的办法就是上次讲的BFS 宽度优先搜索算法 去解决。 这里以这个图为例,求从v1到v7的最短路径。 # include <iostream> # include <stdlib.h> # include <stack> # include <queue> # include <string.h> using namespace std ; int mat [ 100 ] [ 100 ] ; int v , e ; int start ; int stop ; void draw ( ) { cin >> v >> e ; cin >> start >> stop ; for ( int i = 0 ; i < e ; i ++ ) { int v1 , w1 ; cin >> v1 >> w1 ; mat [

堆与堆排序——数据结构的克星

两盒软妹~` 提交于 2020-02-05 13:58:28
其实建堆和堆排序十分的简单,就是不断的向下调整的过程 建堆是从floor(2/i)处开始,一直到根节点,依次不断的向下调整 堆排序是从最后一个节点不断的与第一个根节点交换,然后再让第一 个节点不断的向下的调整 # include <bits/stdc++.h> using namespace std ; int a [ 15 ] = { - 1000 , 1 , 5 , 6 , 3 , 9 , 5 , 4 , 2 , 7 , 7 } ; int n = 10 ; //表示数组的长度 void adjust_down ( int i , int len ) { int left = 2 * i ; int right = 2 * i + 1 ; int m = i ; //记录最大值 if ( left <= len && a [ m ] < a [ left ] ) { m = left ; } if ( right <= len && a [ m ] < a [ right ] ) { m = right ; } if ( m != i ) //如果左右孩子都不满足,就不需要继续向下跟新了 { swap ( a [ m ] , a [ i ] ) ; adjust_down ( m , len ) ; } } void build_heap ( ) { for ( int i =