算法与数据结构

数据结构(java语言描述)串与数组——稀疏矩阵的三元组表存储

拟墨画扇 提交于 2020-01-20 01:22:35
知识点补充: 稀疏矩阵:是具有较多零元素且非零元素的分布无规律的矩阵。(一般矩阵是用多(二)维数组存储)。 但是,稀疏矩阵的存储比较浪费存储空间,因此为了节省存储空间可以用一个三元组表来存储稀疏矩阵。 三元组表:三元组表中的任意一个三元组元素存储了稀疏矩阵中的非零元素、所在行和所在列。 稀疏矩阵转三元表表示的原理图如下(ps手写版,比较快,将就看吧,主要是能明白^~^): java语言表示的三元组(结点)的类形式: package chuanshu; class tripleNode { //三元组的定义 private int row; //元素所在稀疏矩阵中的行号 private int col; //元素所在稀疏矩阵中的列号 private int value; //元素所在稀疏矩阵中的非零元素值 public int getcol(){ return col; } public int getrow(){ return row; } public void setcol(int col){ this.col=col; } public void setrow(int row){ this.row=row; } public int getvalue(){ return value; } public void setvalue(int value){ this.value

数据结构与算法经典问题解析(Java语言描述)——链表相关问题及leetcode中Linkded List Easy题目实现

蹲街弑〆低调 提交于 2020-01-20 00:11:42
链表相关问题 问题1: 找到链表的倒数第n个结点 解答: 1)蛮力法: 从链表的第一个结点开始,统计当前结点后面的结点个数。如果后面结点的个数小于n-1,那么算法结束并返回"链表中的结点个数不足"。如果数量大于n-1,则移动到下一个结点(作为新的当前结点)。重复该过程直至当前结点后面的结点个数等于n-1,算法结束。 时间复杂度O(n²),空间复杂度O(1)。 2)使用散列表 新建一个散列表,表中条目是<结点的位置,结点地址>,散列表中每条记录的主键是结点在链表中的位置,值是该结点的地址。创建散列表,当遍历链表时,可以得到链表的长度。令M表示链表的长度,这样寻找链表的倒数第n个结点问题就转换为寻找链表正数第M-n+1个结点。 时间复杂度O(m),空间复杂度O(m) 3) 求链表长度 根据“使用散列表”方法可以得到启发,其本质就是求链表长度,所以从头遍历链表计算出链表的长度,再计算M-n+1,再从头遍历到第M-n+1个结点。这种方法需要遍历两次链表,一次求表长,一次找第M-n+1个结点 时间复杂度T(n) = O(n) + O(n) = O(n),空间复杂度O(1)。 4)一次扫描,两个指针 使用两个指针pNthNode和pTemp。首先,两个指针都指向链表的表头结点。仅当pTemp进行了n次移动后,pNthNode才开始移动。然后两个指针同时移动,直至pTemp到达表尾

数据结构与算法题目集(中文)6-7 在一个数组中实现两个堆栈 (20分)

柔情痞子 提交于 2020-01-20 00:05:31
本题要求在一个数组中实现两个堆栈。 函数接口定义: Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag ); 其中 Tag 是堆栈编号,取1或2; MaxSize 堆栈数组的规模; Stack 结构定义如下: typedef int Position; struct SNode { ElementType *Data; Position Top1, Top2; int MaxSize; }; typedef struct SNode *Stack; 注意:如果堆栈已满, Push 函数必须输出“Stack Full”并且返回false;如果某堆栈是空的,则 Pop 函数必须输出“Stack Tag Empty”(其中Tag是该堆栈的编号),并且返回ERROR。 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> #define ERROR 1e8 typedef int ElementType; typedef enum { push, pop, end } Operation; typedef enum { false, true } bool; typedef

【数据结构与算法】顺序栈与链式栈及其实现

天涯浪子 提交于 2020-01-19 23:49:55
关于栈,我们先想一个生活中的例子,就是一摞叠在一起的盘子。我们平时放盘子的时候,都是从下往上一个一个放;取的时候,我们也是从上往下一个一个依次取。后进者先出,先进者后出,这就是典型的栈结构。 栈是一种“操作受限”的线性表,只允许在一端进行插入和删除数据。进行操作的那一段被称为栈顶,与此相对,栈的另一端叫做栈底。栈的操作是按照后进先出的原则进行。 顺序栈 采用顺序存储结构的栈称为顺序栈,需要一块连续的区域来存储存储栈中的元素,因此需要实现知道或估算栈的大小。 顺序栈本质上是简化的顺序表。 顺序栈示意图: 基于数组实现顺序栈 public class ArrayStack { //数组 private String[] items; //栈中元素的个数 private int count; //栈的大小 private int n; //初始化数组,申请大小为n的数组空间 public ArrayStack(int n) { this.items = new String[n]; this.n=n; this.count = 0; } //入栈 public boolean push(String item){ //数组空间不够了,直接返回false,入栈失败 if(count==n){ return false; } //将item放到下标为count的位置,并且count加1

常见基本的数据结构——优先队列(堆)

有些话、适合烂在心里 提交于 2020-01-19 22:19:01
在多用户环境中,操作系统调度程序必须决定在若干进程中运行那个进程。一般一个进程只能被允许运用一个固定的时间片。一种算法是使用一个队列。开始时作业被放在队列的末尾。调度程度将反复提取队列中的第一个作业并运行它,直到运行完毕或者该作业的时间片被用完,并在作业为被用完时将其放入队列的末尾。但是一般来说,短的作业要尽可能快地结束,这一点很重要,因此在已经被运行的作业中这些短作业应该拥有优先权。此外,有些作业虽然短小但也很重要,也应该拥有优先权。这种特殊的应用似乎需要一些特殊的队列,我们称之为优先队列。 模型 优先队列应该允许至少下面的两种操作,Insert(插入),以及DeleteMin(删除最小值),它的作用是找出,返回和删除优先队列中的最小值。Insert操作相当于队列的入队,DeleteMin操作相当于队列中的出队操作。在贪婪算法中,优先队列也是重要的,因为该算法通过反复的求出最小元来进行计算。 一些简单的实现 使用简单链表可以在表头进行插入并以O(1)的时间复杂度,但是遍历最小元的话则需要O(N)的时间复杂度。另外的一种思路是始终保持排序状态,这使得插入的高昂代价O(N),而DeleteMin的代价是O(1),但是在实际中,DeleteMin的操作次数从不多于插入的操作次数。 还可以使用二叉查找树来实现优先队列,它对这两种操作的时间都是O(logN)

数据结构与算法(线性表、栈、队列)

给你一囗甜甜゛ 提交于 2020-01-19 12:17:52
数据结构与算法(线性表、栈、队列)     * 最近在学习数据结构与算法,期间也由于理解的不透彻死活不能用程序去实现它。所以我将我的学习过程以及期间出现的问题整理出来,这也是我的再学习过程,也希望能对大家有一点帮助。栈和队列都是使用顺序表实现的,因为相对来说比较简单;在后续的树和图中,使用链表相对简单,所以在树和图中我在放出链表的代码。 逻辑关系      · 在数据结构中,根据逻辑关系可大致分为线性结构(线性表、栈、队列、字符串、数组、广义表)以及非线性结构(树、图)。其中,最为简单且基础的是线性结构,在之后的学习过程中,任何类型的数据结构都或多或少要以它们为基础去创建,去构造。所以在学习的开始,我先基于我的一些不成熟的理解去使用python完成对线性表、栈、队列的构造。 线性表:     1.描述: 线性表是由n (n>=0)个类型相同的数据元素(结点)a1,a2,….,ai,    ….,an组成的有限序列。其中,数据元素的个数n定义为表长。当n=0时称为空表,非空的线性表(n>0)    记为:(a1,a2,….,ai,……,an)     2.逻辑特征:仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。     3.线性表的特点:         同一性:线性表由同类数据元素组成,每一个ai必须属于同一数据对象。         有穷性

数据结构与算法对嵌入式的影响与使用:Studying Route

倾然丶 夕夏残阳落幕 提交于 2020-01-19 02:19:04
未来软件的发展趋势来讲,数据结构与算法会越来越普适: 程序 = 数据结构 + 算法 一方面是因为硬件的不断升级,使得很多嵌入式系统现在已经与桌面系统的区别越来越小,可以跑更多的软件平台,使得数据结构与算法可以有更宽阔的应用场景。 另一方面,即使是嵌入式设备,其软件功能需求也在不断的升级,很多嵌入式平台应用了越来越多的视觉算法、数据库等等,有些需求的背后也是需要数据结构与算法做支撑的。 对于计算机类的特定算法(复杂度较高、运行资源需要多),比如搜索类的、地图求最短、最优路径之类的,在一般的嵌入式里面不太可能用得到,这些可以作为拓展思考用;但是图、红黑树、二叉树、字符匹配、查找、堆等等都是真真正正能够用得到的东西,需要慢慢渗透掌握。 学习路径: 1. 大O(复杂度分析)和迭代器 (最基本的理论) 2. 动态数组vector (理论推导和设计原理) 3. 双链表list (跟STL的双链表list相似) 4. 栈和队列(stack、queue) 5. 优先队列 (堆排序的思想+动态数组vector) 6. 常用算法 (检索,排序,仿函数等设计原理) 7. 轻量级关联容器(用动态排序数组代替红黑树做轻量级关联容器。适合很少的插入和删除、大量的检索,内存紧张的场合。) 8. 内存管理器基础 (边界标记、位图、自由列表、引用计数) 9. 哈希表 (不同数据类型的哈希算法、三个哈希表的原理)

数据结构与算法之堆与堆排序

喜你入骨 提交于 2020-01-18 23:34:42
  在数据结构中, 堆 其实就是一棵 完全二叉树 。我们知道内存中也有一块叫做堆的存储区域,但是这与数据结构中的堆是完全不同的概念。在数据结构中,堆分为 大根堆 和 小根堆 ,大根堆就是根结点的关键字大于等于任一个子节点的关键字,而它的左右子树又分别都是大根堆;小根堆与大根堆恰好相反。在C++的STL中优先队列priority_queue结构就是实现的堆结构。下来自己动手现实一个堆结构,包括heap_init,heap_insert,heap_top等操作。 1、堆的实现   因为堆是一棵完全二叉树,所以我们可以用顺序表来实现,而且堆也只能用顺序表。我们用vector。    (1) 堆的初始化    对堆的初始化基本思想:首先初始数组是一个杂乱无章的序列,但是如果堆中只有一个元素heap[0],那么heap[0]本身是一个堆,然后加入heap[1]调整堆;继续加入heap[2].....直到完成所有元素的调整。 void sift_up(vector<int> &heap,int index){ while((index+1)/2-1 >= 0){ if(heap[(index+1)/2-1] < heap[index]){ swap(&heap[(index+1)/2-1],&heap[index]); index = (index+1)/2-1; }else break; }

数据结构与算法基础

南楼画角 提交于 2020-01-18 08:41:57
数据结构简介: 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。 数据结构的基本操作的设置的最重要的准则是,实现应用程序与存储结构的独立。实现应用程序是“逻辑结构”,存储的是“物理结构”。逻辑结构主要是对该结构操作的设定,物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、希哈结构)等。 数据 :所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素 :数据(集合)中的一个“个体”,数据及结构中讨论的基本单位 数据项 :数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型 :在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等
 数据结构示意图 数据的逻辑结构:数据之间的相互关系。 在数据结构中,从逻辑上可以将其分为线性结构和非线性结构 集合: 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构: 数据元素之间一对一的关系 树形结构: 数据元素之间一对多的关系 图状结构或网状结构: 结构中的数据元素之间存在多对多的关系 数据的物理结构/存储结构:数据在计算机中的表示。 物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、哈希结构)等 顺序存储结构 :是把数据元素存放在地址连续的存储单元里

数据结构的基本概念

扶醉桌前 提交于 2020-01-18 08:41:43
数据元素:是组成数据的、有一定意义的基本单位。在计算机中通常作为总体处理。也被称为记录。 数据项:一个数据元素能够有若干个数据项组成。 数据项是数据不可切割的最小单位。 数据对象:是性质同样的数据元素的集合。是数据的子集。 结构:结构是指各个组成部分相互搭配的排列的方式。不容数据元素之间不是独立的。而是存在特定关系,我们将这些特定关系的称为结构。 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 逻辑结构:是指数据对象中数据元素之间的相互关系。 分为下面四种: 1、集合结构: 集合结构的数据元素除了通数据一个集合外,它们之间没有其它关系。 各个数据元素是“平等”的。他们的共同属性是“同属于一个集合”。数据结构中的集合关系就类似数学中的集合。 2、线性结构:线性结构中的数据元素之间的一对一的关系。 3、树形结构:树形结构中的数据元素之间存在一种一对多的层次关系 4、图形结构:图形结构的数据元素是多对多的关系。 物理结构:(存储结构)指数据的逻辑结构在计算机中的存储形式。存储器主要是针对内存而言,像硬盘、软盘、光盘等外部存储器的数据组织通经常使用文件结构描写叙述。 数据的存储元素直接按的逻辑关系。是实现物理结构的重点和难点。 数据元素的存储结构形式有两种:顺序存储和链式存储。 1、顺序存储结构:是把数据元素存放在地址连续的存储单元里。其数据间的逻辑关系和物理关系是一致的。