算法与数据结构

数据结构与算法之PHP排序算法(快速排序)

拜拜、爱过 提交于 2020-02-15 05:33:17
一、基本思想 快速排序又称划分交换排序,是对冒泡排序的一种改进,亦是分而治之思想在排序算法上的典型应用。 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列的目的。 二、算法过程 1)从数列中挑出一个元素,称为“基准值”; 2)将待排序元素进行分区,比基准值小的元素放在基准值前面,比基准值大的元素放在基准值后面。分区结束后,该基准值就处于数组的中间位置; 3)对左右两个分区重复以上步骤直到所有元素都是有序的。 三、算法图解及 PHP代码实现 1、替换版 上图只给出了第1趟快速排序的流程。在第1趟排序中,设置pivot=arr[i],即pivot=3。 1) 右 → 左 查找小于pivot的数:找到满足条件的数arr[j]=2,此时j=4;然后将a[j]赋值a[i],此时i=0;接着从左往右遍历。 2) 左 → 右 查找大于pivot的数:找到满足条件的数arr[i]=4,此时i=1;然后将a[i]赋值a[j],此时j=4;接着从右往左遍历。 3) 右 → 左 查找小于pivot的数:找到满足条件的数arr[j]=1,此时j=3;然后将a[j]赋值a[i],此时i=1;接着从左往右遍历。 4) 左 → 右

Redis系列 - 数据结构

早过忘川 提交于 2020-02-14 11:13:54
前言   转载自微信公众号:三太子敖丙 1、问:Redis有那些数据结构?   常见的5种:字符串(String),散列(Hash), 列表(List),集合(Set),有序集合(SortedSet)等;除此之外,还有HyperLogLog、Geo、Pub/Sub。    注 :之前项目组也有遇见过 BloomFilter( 布隆过滤器 ),这个能很好地防止缓存穿透的发生,它的原理也很简单,就是利用高效的数据结构和算法快速判断出你这个 Key 是否在数据库中存在,不存在你 Return 就好了,存在你就去查了DB刷新Key、Value,再Return。   传送门:《 防止缓存穿透的神器:BloomFilter》 2、问:Redis的5种数据结构,有哪些最适合的使用场景?   答:先从String说起吧。 String :   这个是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。   但是真实的开发环境中,很多人可能会把很多比较复杂的结构也统一转成 String 去存储使用,比如有的人他就喜欢把 对象 或者 List 转换为 JSONString 进行存储,拿出来再反序列化。   这里就不讨论这样做的对错了,但是我们在日常开发中,还是能在最合适的场景使用最合适的数据结构,这也是 代码规范 的一个表现。 String的适应应用场景比较多 缓存功能 :String

数据结构与算法(2)

a 夏天 提交于 2020-02-14 01:51:24
1 双向线性链表 2 单向线性链表 1 双向线性链表 1.1 问题 双向线性链表是采用链式存储的方式存储的线性表。链式存储结构是由一系列结点(链表中每一个元素称为结点)组成,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储当前结点的前驱结点和后继结点地址的指针域,结点是在有数据时动态生成的,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1.2 方案 双向线性链表的基本操作包括: 初始化操作,在初始化操作中将双向线性链表的头指针指空。 求表长,求表长操作是计算出双向线性链表中结点的个数。 取双向线性链表中指定位置的结点,即给定双向线性链表中的第几个结点,求其值。 查找结点,在双向线性链表中查找值为x的结点,并返回该结点在双向线性链表中的位置。若双向线性链表中有多个结点的值和x相同,则返回首次找到的结点位;若双向线性链表中没有结点的值为x,则返回一个NULL表示查找失败。 插入结点,在双向线性链表的第i个结点前插入一个值为x的新结点。 删除结点,删除双向线性链表的第i个结点。 1.3 步骤 实现此案例需要按照如下步骤进行。 步骤一:定义双向线性链表 在C语言中: 1)定义一个变量来表示双向线性链表中某个结点的数据。 2)定义两个指针来表示该结点的前驱结点和后继结点的地址。 3

数据结构与算法(4)

纵饮孤独 提交于 2020-02-14 01:16:08
1 冒泡排序 2 插入排序 3 选择排序 4 归并排序 5 线性查找 6 二分查找 1 冒泡排序 1.1 问题 冒泡排序是一种著名的排序方法。 冒泡排序的过程是这样的,首先,将待排序的数组中的第一个元素与第二个元素相对比,如果这两个元素的大小顺序不是我们要求的顺序,则将它们交换过来。然后,将待排序的数组中的第二个元素与第三个元素相对比,如果这两个元素的大小顺序也不是我们要求的顺序,则也将它们交换过来。下一步,是对比第三个元素与第四个元素,直至倒数第二个元素与最后一个元素相对比。这样一趟对比下来,小的数据元素会一点一点的往前放,而大的数据元素会一点一点的往后放。反复多趟的这样对比,直到所有数据都排好序为止。 1.2 方案 为了理解冒泡排序算法,我们先假设有一个长度为10的数组,数组内容如图-1所示: 图-4中的数组元素为无序状态,现需要将数组内的元素排序成从小到大的升序状态。可以先进行第一趟比较。首先比较第1个和第2个数,也就是数组第一个元素3和数组第二个元素2,将小数放前,大数放后。交换后如图-2所示: 然后,将图-2中的第2个和第3个数,也就是数组第二个元素3和数组第三个元素4,进行对比,由于3小于4,所以不进行交换。接着将图-2中的第3个和第4个数对比后发现也不需要交换。这样依次进行对比,直到图-2中的第7个和第8个数,也就是数组第七个元素9和数组第八个元素1,对比时

数据结构(二) -- 数组和链表

一曲冷凌霜 提交于 2020-02-13 14:04:37
/*--> */ /*--> */ /*--> */ /*--> */ 数据结构(二) -- 数组和链表 数据结构主要可以分为两大模块: 线性结构 非线性结构 本文主要开始讲线性结构。 什么是线性结构 线性结构,顾名思义,就是这些数据所有节点都能被一根线(指针)联系起来的一种结构。 线性结构的存储方式: 连续存储:【数组】 离散存储:【链表】 线性结构的常见应用方式: 栈 队列 专题 :【递归】 数组和链表 本小节学习数组和链表,从底层去了解和实现数组与链表,并分析两者对应的优缺点 数组 数组是最常见的链式存储结构,它是一段连续的内存空间,在内存中我们可以简单表示为下图样式 通过上图我们可以把代码中 int arr[6] = {1,2,3,4,5,6}; 执行的操作从内存中脑补出来,同时我们可以简单分析一下,数组应该有的一些基本使用。如 初始化、 添加新元素、 插入新元素、 删除某个元素、 判断是否为空数组、 是否是满数组、 排序 倒序 查询是否包含某个元素 ······ 本小节就带着你手把手实现一个简单的数组的封装,借此来了解数组的数据结构以及内部的一些基本算法知识。这里就简单的以一个 int 类型的数组来示例,后面学到泛型的时候便可更加好的理解数组的实现。 首先简单分析一下数组中基本的属性,我们有上面的数组内存中的逻辑图可以确定数组有对应的内存空间,有一个内存起始地址

数据结构课设任务内容

ⅰ亾dé卋堺 提交于 2020-02-12 23:09:42
1.单位员工通讯录管理系统(线性表的应用) 【问题描述】 为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。 [实现提示] 可以采用单链表的存储结构,如可定义如下的存储结构: typedef struct { / 员工通讯信息的结构类型定义 / char num[5]; / 员工编号 / char name[10]; / 员工姓名 / char phone[15]; / 办公室电话号码 / char call[15]; / 手机号码 / char mail[25]; / 邮箱 /## 标题 } ElemType; / 通讯录单链表的结点类型 / typedef struct LNode { ElemType data; / 结点的数据域 / struct LNode *next; / 结点的指针域 / }LNode,*LinkList; 2.算法设计思路 创建通讯录方法,录入员工信息,当记录第一个员工信息,头节点不再为空,把第一个节点赋予给下一个结点,继续录入,直到完成,把尾结点赋予成空。 创建多个方法 void CreateList ( LinkList & L ) //创建通讯录 void GetdataList ( LinkList & L )

学习数据结构与算法(二)

北城余情 提交于 2020-02-12 20:53:12
Hello,everyone ! 想以一个轻松愉悦的心情来开始我的每一篇文章。 这是每一次的整理和缩影,希望大家可以发表意见,促进成长。 正值这个特殊时期,在家里开始研究数据结构与算法的问题,若有不对的地方,请各位指教!~~~ 接下来主要看一下数组。 一.使用 1.创建数组 最简单的方法就是通过 [ ] 操作符来声明一个变量(推荐这种方法) var numbers=[]; print(numbers.length); //0 还可以用Array的构造函数创建数组 var numbers=new Array(1,2,3); print(numbers.length); //5 在脚本语言里很常见的一个特性,数组中的元素不必是同一种数据类型,这一点和很多编程语言不同。 var sbjects=["Joe",1,true,null]; 可以通过Array.isArray 来判断一个对象是否是数组。 2.读写数组(这里不做介绍) 3.由自负床生成数组 .split() var sentence="12454314"; var array=sentence.split("4"); for(var i=0;i<array.length;++i){ print("word"+i+":"+array[i]); } //word 0:124 //word 1:54 //word 2:314 4

【笔记】数据结构和算法

回眸只為那壹抹淺笑 提交于 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] =

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

。_饼干妹妹 提交于 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>* //定义指向列表节点的数据类型(节点位置)

数据结构与算法题目集(中文)7-22 堆栈模拟队列 (25分)

跟風遠走 提交于 2020-02-09 03:25:09
1.题目 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S) :判断堆栈 S 是否已满,返回1或0; int IsEmpty (Stack S ) :判断堆栈 S 是否为空,返回1或0; void Push(Stack S, ElementType item ) :将元素 item 压入堆栈 S ; ElementType Pop(Stack S ) :删除并返回 S 的栈顶元素。 实现队列的操作,即入队 void AddQ(ElementType item) 和出队 ElementType DeleteQ() 。 输入格式: 输入首先给出两个正整数 N1 和 N2 ,表示堆栈 S1 和 S2 的最大容量。随后给出一系列的队列操作: A item 表示将 item 入列(这里假设 item 为整型数字); D 表示出队操作; T 表示输入结束。 输出格式: 对输入中的每个 D 操作,输出相应出队的数字,或者错误信息 ERROR:Empty 。如果入队操作无法执行,也需要输出 ERROR:Full 。每个输出占1行。 输入样例: 3 2 A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T 输出样例: ERROR:Full 1