算法与数据结构

数据结构与算法(作业五)

孤街浪徒 提交于 2020-03-02 04:02:11
合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 运算代码如下 class Solution { public void merge ( int [ ] nums1 , int m , int [ ] nums2 , int n ) { int len = m + n ; for ( int i = len - 1 ; i >= 0 ; i -- ) { if ( ( m > 0 && n > 0 && nums1 [ m - 1 ] > nums2 [ n - 1 ] ) || n == 0 ) { nums1 [ i ] = nums1 [ -- m ] ; } else { nums1 [ i ] = nums2 [ -- n ] ; } } } } 这道题从两个数组右侧开始比较, 即可按从大到小开始合并数组, 即可利用数组1右侧的空间, 不需要额外存储空间。 效率挺高! 来源: CSDN 作者: 想扣篮的Phineas 链接: https://blog.csdn.net/BryceFei/article/details/104590947

常用数据结构以及数据结构的排序算法

耗尽温柔 提交于 2020-03-02 02:39:24
数组 (Array)   在程序设计中,为了处理方便, 把具有相同类型的若干 变量 按有序的形式组织起来。这些按序排列的同类数据元素的集合称为 数组 。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、 指针数组 、结构数组等各种类别。 栈 (Stack)   是只能在某一端插入和删除的特殊 线性表 。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 队列 (Queue)   一种特殊的 线性表 ,它只允许在表的 前端 (front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 链表 (Linked List)   是一种物理存储单元上非连续、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时 动态 生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 树 (Tree)   是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:  

设计模式(行为型模式)——访问者模式(Visitor)

烂漫一生 提交于 2020-03-02 00:05:19
访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。其缺点就是增加新的数据结构很困难。—— From 百科 简单来说,访问者模式就是一种分离对象数据结构与行为的方法,通过这种分离,可达到为一个被访问者动态添加新的操作而无需做其它的修改的效果。简单关系图: 来看看原码:一个Visitor类,存放要访问的对象, public interface Visitor { public void visit(Subject sub); } public class MyVisitor implements Visitor { @Override public void visit(Subject sub) { System.out.println("visit the subject:"+sub.getSubject()); } } Subject类,accept方法,接受将要访问它的对象,getSubject()获取将要被访问的属性, public

数据结构与算法(作业四)

吃可爱长大的小学妹 提交于 2020-03-01 19:21:19
最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 运算代码如下: class Solution { public : int maxSubArray ( vector < int > & nums ) { if ( nums . size ( ) == 0 ) return NULL ; int max = nums [ 0 ] ; int sum = 0 ; for ( int i = 0 ; i < nums . size ( ) ; i ++ ) { sum = 0 ; for ( int j = i ; j < nums . size ( ) ; j ++ ) { sum + = nums [ j ] ; if ( sum > max ) max = sum ; } } return max ; } } ; 此代码首先判断了数组是否是空的,这个要不要随你了。然后定义max是用来存储最大值的,sum是用来求和的。首先循环数组长度次数的i,在i里面再次循环数组长度次数的j,目的是用来找出最大的和,所以做一下简单的判断,一直不断的找出最大的和,最终返回即可。 像这样的暴力做法,运算的确很费时间。 来源: CSDN 作者: 想扣篮的Phineas 链接: https://blog.csdn.net/BryceFei

树—最“有套路”的数据结构

ぃ、小莉子 提交于 2020-03-01 09:41:13
前言 标题用“有套路”来形容一种数据结构,似乎有点不尊重的意思。不过,我倒是觉得,一种实用的学科,就是应该产生一点套路,这才能发挥体系化研究的优势,套路就是一种保证: 在不投入更多创造性与努力的情况下,依旧能获得比起随意进行相关操作更好的结果 。一门成熟的学科都应如是,如果研究许久,在学科所研究的许多问题的实践上还不如一些“天赋”“灵感”,那就不得不说这门学科的“伪科学”或者“水分”还是蛮大的了。 言归正传,这篇文章将会是一系列寻找算法与数据结构的文章的开篇,树由于其特性,是递归、分治等等重要算法思想的典型载体,同时套路性较强又具有一定规律和难度,上手后,也可以获得总结其他算法“套路”的必要经验。作为一个训练的开头,还是很合适了。 树的定义与理解 先简要谈谈树的抽象定义:树本质上是一种无向图( 图:由顶点与路径构成的数据结构 ),其中,任意两个顶点之间 有且只有一条 路径。简而言之,树是一种具有特殊性质的图。 树的结构非常直观,而且树的大多数结构具有一个重要性质: 递归 。主要来说,就是树具有某一性质时,往往其子树也具有同样的性质。比如说,一个树如果是二叉搜索树,其子树也必须是二叉搜索树。 根据这样的性质,遇到树的问题,很自然会考虑如何合理使用递归算法,其实质就是:分解为子问题,最后解决基本情况,把复杂的递归过程交给计算机来处理。所以,树类型代码的特点就是简洁(不过换句话说

【C/C++】实现数据结构广义表

末鹿安然 提交于 2020-03-01 07:40:01
1. 广义表的定义 每个元素可以为Atom,原子,也可以为线性表。 线性表的推广。线性表元素有唯一的前驱和后继,为线性表,而广义表是多层次的线性表 表头:第一个元素,可能是原子,可能是广义表 表尾:除了第一个元素,剩余的元素,所构成的广义表 举例: A = (a,b,(c,d),e) head(A) = a tail(A) = (b,(c,d),e) 遍历操作: 取表头,取表尾 ,取表头.. 长度:最外层的元素数,即最外层的','+1 深度:括号层数 2. 广义表的两种存储结构(子表法) 2.1链式存储结构 - 每个数据元素可以用一个节点表示 元素可以为原子或列表 原子节点:标志域、值域 列表节点:标志域、指示表头的指针域、指示表尾的指针域 空表:A = NULL 除了空表,表头指针指向一个表节点,表节点再分表头、表尾... 最高层表节点(可能原子、子表)的个数就是表长度? A = (a,b,(c,d),e) 最高层表头是先a,表尾是(b,(c,d),e),表头是b,表尾((c,d),e)..就是第一层的表尾直到为空之前,有过的表尾指针+1 判断是否在同一层次? 是这样的: 最高层处于同一层,后继的tail指针指向的是同一层,否则,head指针,或者表头是Atom,都是下一层。 2.2扩展线性表存储结构 不是用表头表尾指针了,而是,每一个节点,不管是子表还是原子

数据结构习题之多维数组和广义表

二次信任 提交于 2020-03-01 06:57:10
第五章 多维数组和广义 表 一、基本要求、重点、难点 本章目的是介绍多维数组的逻辑结构特征及其存储方式。特殊矩阵和稀疏矩阵的压缩存储方法。本章重点是熟悉多维数组的存储方式、矩阵的压缩存储方式,难点是稀疏矩阵的压缩存储方示下实现的算法。 二、考核目标、考核要求 1.多维数组,要求达到“理解”层次 1.1多维数组的逻辑特征。 1.2多维数组的顺序存储结构及地址计算方式。 1.3数组是一种随机存取结构的原因。 2.矩阵的压缩存储,要求达到“理解”层次 2.1特殊矩阵和稀疏矩阵的概念。 2.2特殊矩阵的压缩存储时的下标变换方法。 2.3稀疏矩阵的三元组表表示方法及有关算法。 三、练习题 1.单项选择题 1.1二维数组M的元素是4个字符(每一个字符占一个存储单元)组成的串,行下标i的范围是从0到7,列下标j的范围从0到9。则存放M须要存储单元数为( D ) A) 360 B)480 C) 240 D) 320 凝视:由题目知:8*10*4=320。 1.2 N是一个5×8的二维数组,当N按行优先方式存储时,表示该数组的第10个元素的是( C ) A) N[2][2] B)N[2][1] C) N[1][1] D)N[1][2] 凝视:五行八列的数组的第十个的元素为N[1][1]元素为第二行第二列的元素。 1.3 二维数组M[i][j]的元素是4个字符(每一个字符占一个存储单元)组成的串

数据结构(十七)数组和矩阵

点点圈 提交于 2020-03-01 06:55:49
  一、数组的定义:数组是n(n>=1)个相同数据类型的数据元素构成的占用一块地址连续的内存单元的有限集合。所有的线性结构(包括线性表、堆栈、队列、串、数组和矩阵)的顺序存储结构实际上就是使用数组来存储。可见,数组是其他数据结构实现存续存储结构的基础,数组这种数据结构是软件设计中最基础的数据结构。   二、数组的实现机制:数组通常以字节为计数单位,同时根据内存单元地址映像公式来分配内存。用高级语言定义数组时,数组在内存中的首地址由系统动态分配并保存。高级语言通常用数组名保存在内存中的首地址。一旦确定了一个数组的首地址,系统就可计算出该数组中任意一个数组元素的内存地址。由于计算数组各个元素内存地址的时间相等,所以存取数组中任意一个元素的时间也相等,通常称具有这种特性的存储结构为随机存储结构。所以说数组具有随机存储结构的特性。   三、在数值分析中,常常会出现一些拥有许多相同数据元素或零元素的高阶矩阵。将具有许多相同元素或者零元素,且数据分布具有一定规律的矩阵称为特殊矩阵,例如,对称矩阵、三角矩阵和对角矩阵。为了节省存储空间,需要对这类矩阵进行压缩存储。压缩存储的原则是:多个值相同的矩阵元素分配同一个存储空间,零元素不分配存储空间。对于对称矩阵、三角矩阵和对角矩阵来说,首先根据矩阵中任意一个元素与压缩后一位数组的下标的对应关系得到每一个数据元素在数组中存储的位置

数据结构与算法单排日记-2020/2/29-数据结构综述

有些话、适合烂在心里 提交于 2020-03-01 06:55:44
1.栈——先进先出 入口出口在集合的一侧 2.队列——先进先出 入口和出口在集合的一侧 3.数组:查询快,增删慢 查询快 :数组的地址是 连续 的,通过数组的首地址找到数组,通过数组的索引可以快速查找某个元素 增删慢 :数组长度固定,想要增加/删除一个元素,必须创建一个新数组,把源数组复制过来 3.链表:查询慢,增删快 查询慢 :链表的地址是 不连续 的,每次查询元素都要从头开始 增删快 :链表结构,增加/删除一个元素,对链表的整体结构没有影响 链表中每一个元素成为节点,1个节点=1个数据源(存储数据)+2个指针域(存储地址) 类型 单向链表:只有一条链子,不能保证存储和取出的顺序一致 双向链表:两条链子,有一条链子专门记录元素的顺序 增删 5.红黑树:查询速度非常快 来源: CSDN 作者: Mango学习日记 链接: https://blog.csdn.net/wangzilong1995/article/details/104575824

Redis数据结构——字典

∥☆過路亽.° 提交于 2020-03-01 04:09:29
除了用来表示数据库之外,字典也是哈希键的底层实现 typedef struct dictEntry { void *key; //键 union { //值 void *val; uint64_t u64; int64_t s64; double d; } v; struct dictEntry *next; //指向下个哈希表节点,形成链表 } dictEntry; typedef struct dictType { unsigned int (*hashFunction)(const void *key); void *(*keyDup)(void *privdata, const void *key); void *(*valDup)(void *privdata, const void *obj); int (*keyCompare)(void *privdata, const void *key1, const void *key2); void (*keyDestructor)(void *privdata, void *key); void (*valDestructor)(void *privdata, void *obj); } dictType; /* This is our hash table structure. Every dictionary has