数据结构

【笔记】数据结构和算法

回眸只為那壹抹淺笑 提交于 2020-02-10 23:09:13
1. 数据结构与算法——从零开始学习(一)基础概念篇 2. 大话数据结构 – 整理归纳(1) 3. Java数据结构 算法复杂度速查表 十大经典排序算法 程序员必须掌握的核心算法有哪些? 文章目录 线性表 线性表 public interface List<T> { public void add(T t); public void insert(T t, int index); public T remove(int index); public boolean isEmpty(); public T get(int index); public void validate(int index); public int size(); } public class ArrayList<T> implements List<T> { public Object[] objects = {}; private int size; public ArrayList() { } public ArrayList(int len) { objects = new Object[len]; } @Override public void add(T t) { size++; objects = Arrays.copyOf(objects, size); objects[size - 1] =

位图bitmap数据结构

谁都会走 提交于 2020-02-10 21:51:37
位图是一种很特殊的数据结构,可以利用位图来排序,但是这种排序方法对输入的数据是有比较严格的要求(数据不能重复,大致知道数据的范围)。举个例子,假如有一个集合{3,5,7,8,2,1},我们可以用一个8位的二进制向量set[1-8]来表示该集合,如果数据存在,则将set相对应的二进制位置1,否则置0.根据给出的集合得到的set为{1,1,1,0,1,0,1,1},然后再根据set集合的值输出对应的下标即可得到集合{3,5,7,8,2,1}的排序结果。 位图的应用: 1.给40亿个不重复的unsigned int的整数,没有排过序,然后再给一个数,如果快速判断这个数是否在那40亿个数当中。 因为unsigned int数据的最大范围在在40亿左右,40 10^8/1024 1024*8=476,因此只需申请512M的内存空间,每个bit位表示一个unsigned int。读入40亿个数,并设置相应的bit位为1.然后读取要查询的数,查看该bit是否为1,是1则存在,否则不存在。 2.给40亿个unsigned int的整数,如何判断这40亿个数中哪些数重复? 同理,可以申请512M的内存空间,然后读取40亿个整数,并且将相应的bit位置1。如果是第一次读取某个数据,则在将该bit位置1之前,此bit位必定是0;如果是第二次读取该数据,则可根据相应的bit位是否为1判断该数据是否重复。

MongoDB 使用B树

你说的曾经没有我的故事 提交于 2020-02-10 18:13:49
概述 MongoDB 是一个通用的、面向文档的分布式数据库[^1],这是官方对 MongoDB 介绍。区别于传统的关系型数据库 MySQL、Oracle 和 SQL Server,MongoDB 最重要的一个特点就是 『面向文档』 ,由于数据存储方式的不同,对外提供的接口不再是被大家熟知的 SQL,所以被划分成了 NoSQL,NoSQL 是相对 SQL 而言的,很多我们耳熟能详的存储系统都被划分成了 NoSQL,例如:Redis、DynamoDB[^2] 和 Elasticsearch 等。 NoSQL 经常被理解成没有 SQL(Non-SQL)或者非关系型(Non-Relational)[^3],不过也有人将其理解成不只是 SQL(Not Only SQL)[^4],深挖这个词的含义和起源可能没有太多意义,这种二次解读很多时候都是为营销服务的,我们只需要知道 MongoDB 对数据的存储方式与传统的关系型数据库完全不同。 MongoDB 的架构与 MySQL 非常类似,它们底层都使用了可插拔的存储引擎以满足用户的不同需求,用户可以根据数据特征选择不同的存储引擎,最新版本的 MongoDB 使用了 WiredTiger 作为默认的存储引擎[^5]。 作为 MongoDB 默认的存储引擎,WiredTiger 使用 B 树作为索引底层的数据结构,但是除了 B 树之外,它还支持 LSM

数据结构学习笔记-线性表

那年仲夏 提交于 2020-02-10 17:59:50
线性表 主要内容 2.1 线性表的定义和特点 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 顺序表和链表的比较 补充知识点:参数的值传递 参数传递有两种方式 : (1)传值方式(参数为整型、实型、字符型等) (2)传地址 l 参数为指针变量 l 参数为引用类型 l 参数为数组名 参数的值传递: # include <iostream.h> void swap ( int m , int n ) { int temp ; temp = m ; m = n ; n = temp ; } void main ( ) { int a , b ; cin >> a >> b ; swap ( a , b ) ; cout << a << endl << b << endl ; } 能否实现预想功能? 形式参数的值的改变并不改变实际参数的值!! 参数的指针变量传递: # include <iostream.h> void swap ( int * m , int * n ) { int temp ; temp = * m ; * m = * n ; * n = temp ; } void main ( ) { int a , b , * p1 , * p2 ; cin >> a >> b ; p1 = & a ; p2 = & b ; swap ( p1 , p2 )

数据结构——顺序存储 和&链式存储的区别用法

耗尽温柔 提交于 2020-02-10 17:59:34
目录: 一:顺序存储结构 二: 链式存储结构 数据的 存储结构 应正确 反映 数据 元素之间 的 逻辑关系 数据元素的 存储结构形式 有两种: 顺序存储 和 链式存储 一:顺序存储结构 是把数据元素 存放在 地址连续的存储单元里 其数据间的逻辑关系和物理 关系是一致的 二: 链式存储结构 是把数据元素 存放在 任意的存储单元里 这组存储单元 可以 是 连续 的 也可以 是 不连续 的 来源: CSDN 作者: 刘鑫磊rr 链接: https://blog.csdn.net/liu17234050/article/details/104251282

mysql数据结构

非 Y 不嫁゛ 提交于 2020-02-10 13:02:29
为什么需要使用索引? MySQL官方对索引的定义为:索引(Index)是帮助 MySQL 高效获取数据的数据结构。 白话文:索引就像书的目录一样可以非常快速的定位到书的页码。 如果向mysql发出一条sql语句请求,查询的字段没有创建索引的话,可能会导致全表扫描,这样的话查询效率非常低。 MySQL中索引采用那些数据结构 Hash算法 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 index=Hash(key) 优点:查找可以直接根据key访问 缺点: 不能进行范围查找( 因为底层数据结构是散列的,无法进行比较大小 ) 平衡二叉树算法 平衡二叉查找树,又称 AVL树。 它除了具备二叉查找树的基本特征之外,还具有一个非常重要的特点:它 的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值(平衡因子 ) 不超过1。 也就是说AVL树每个节点的平衡因子只可能是-1、0和1(左子树高度减去右子树高度)。 优点:平衡二叉树算法基本与二叉树查询相同,效率比较高 缺点:插入操作需要旋转,支持范围查询( 回旋效率低 ), 且如果树的高度越高,查询IO的次数越多 B树

数据结构与算法(三)——列表

。_饼干妹妹 提交于 2020-02-10 12:23:03
数据结构与算法(三)——列表   iwehdio的博客园: https://www.cnblogs.com/iwehdio/ 1、列表的定义 静态与动态: 操作的静态与动态: 静态:仅读取,数据结构的内容与组成一般不变。 动态:需写入,数据结构的局部或整体将改变。 数据元素存储与组织方式的静态与动态: 静态:数据空间整体创建或销毁,数据元素的物理存储词语与其逻辑次序一致。 静态操作高效,动态操作相对低效。如相邻。 动态:为各数据元素哦的那个太多分配和回收物理空间。逻辑上相邻的元素记录彼此的物理地址,在逻辑上形成一个整体。动态操作高效,静态操作相对低效。如列表。 列表:采用动态存储的典型结构。 每个元素称为节点( node )。 各个节点通过指针或引用彼此联接,在逻辑上构成一个线性序列。 相邻节点彼此互称前驱和后继。如果存在前驱和后继,那么必然是唯一的。 没有前驱的节点成为首,没有后继的节点称为末。此外,可以认为头存在一个哨兵前驱称为头,末存在一个哨兵后继称为尾。 可以认为 头、首、末、尾 节点的秩分别为 -1、0、n-1、n。 在访问时尽量不使用循秩访问,而使用循位置访问。即利用节点制件的相互引用,找到特定的节点。 列表元素的ADT接口: 列表节点:ListNode 模板类。 #define Posi(T) ListNode<T>* //定义指向列表节点的数据类型(节点位置)

数据结构-栈

女生的网名这么多〃 提交于 2020-02-10 09:21:42
栈的抽象数据类型: 栈是一种用于存储数据的简单数据结构,有点类似链表或者顺序表(统称线性表),栈与线性表的最大区别是数据的存取的操作,我们可以这样认为栈(Stack)是一种特殊的线性表,其插入和删除操作只允许在线性表的一端进行,一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈(Push),删除元素的操作称为出栈(Pop)。若栈中没有任何元素,则称为空栈,栈的结构如下图: 列表实现栈:    class Stack: def __init__(self): self.stack=[] def push(self,element): self.stack.append(element) def pop(self): return self.stack.pop() def get_top(self): if len(self.stack)>0: return self.stack[-1] else: return Nonestack = Stack()stack.push(1)stack.push(2)stack.push(3)stack.pop()print(stack.stack)栈的应用: def brace_match(s): match = {'}':'{',']':'[',')':'('} stack =

Hash算法(含python实现)

一个人想着一个人 提交于 2020-02-10 07:26:18
1. 简介 哈希(hash)也翻译作散列。Hash算法,是将一个不定长的输入,通过散列函数变换成一个定长的输出,即散列值。 这种散列变换是一种单向运算,具有 不可逆性 即不能根据散列值还原出输入信息,因此严格意义上讲 Hash算法是一种消息摘要算法 ,不是一种加密算法。常见的hash算法有:SM3、MD5、SHA-1等 。 2. 应用 Hash主要应用在数据结构以及密码学领域。 在不同的应用场景下,hash函数的选择也会有所侧重。比如在管理数据结构时,主要要考虑运算的 快速性 ,并且要保证hash 均匀分布 ;而应用在密码学中就要优先考虑 抗碰撞性 ,避免出现两段不同明文hash值相同的情况发生。 2.1 在密码学领域的应用 在密码学中,Hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。比如一些登陆网站并不会直接明文存储用户密码,存储的是经过hash处理的密码的摘要(hash值),当用户登录时只需要对比输入明文的摘要与数据库存储的摘要是否相同;即使黑客入侵或者维护人员访问数据库也无法获取用户的密码明文,大大提高了安全性。 2.2 在数据结构中的应用 使用Hash算法的数据结构叫做哈希表,也叫散列表,主要是为了提高查询的效率。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数就是hash函数,存放记录的数组叫做哈希表

数据结构中的hash

自作多情 提交于 2020-02-10 07:25:50
最近接触数据结构的时候突然发现一直在使用哈希表,哈希算法。那么到底什么是哈希(hash)。查找资料发现一个比较有意思的解释,在此分享一下。 人家说的很好我就直接粘过来。 ============================================================================================================================ 但凡是从事过计算机行业的人,多多少少都会听说过这个概念,但是又对其很模糊,那么到底什么是Hash呢? 定义 Hash一般翻译为散列,还有音译为哈希,本文我们统称为哈希(这么叫好听,哈希=散列),通过百度以及谷歌都没有直接找到Hash的定义,而是找到了一些相关的概念,哈希算法,哈希函数,哈希表等概念。 我所理解的哈希是指一个过程,这个过程就是把任意长度的输入,通过哈希算法,变换成固定长度的输出,所输出的称为哈希值。这种变换是一种压缩映射,也即哈希值所占的空间一般来说远小于输入值的空间,不同的输入可能会哈希出相同的输出(概率很小)。 哈希函数、算法 哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改一个字母的段落,随后的哈希都将产生不同的值