线性表

时间和空间复杂度最少的求两个升序数组的中位数

我是研究僧i 提交于 2019-12-09 13:24:12
题目描述: 一个长度为L的升序S,处在L/2向下取整处的位置的数称为S的中位数。 现求两个等长的两个升序序列A和B的中位数。 分析:当然这题如果不要求最高效的话,可以完全重新开辟一个2倍长度的数组C,然后将A,B数组合并到C中,然后得其(L/2 - 1)处的值,即可。但空间复杂度较高为O(n),并且合并的时间复杂也为O(n),所以自己又进一步改进了一下,将空间复杂度降到了O(1),但时间复杂度依旧是O(n).下面给出代码: #include<stdio.h> int M_serach(int s1[],int s2[]){ int mid=0; int len = 5; int i=0,j=0; while(i<len&&j<len){//其实就是模拟合并的过程只是不需要将其装入C数组中了 if(s1[i]>s2[j]) { j++; mid++; if(mid == len-1) printf("%d\n",s1[i]); }else{ i++; mid++; if(mid == len-1) { printf("%d\n",s2[j]); } } } } //为了方便,我就任意取了几组测试数据 int s1[] = {1,3,5,7,9}; int s2[] = {2,4,6,8,20}; int main(){ M_serach(s1,s2); return 0; }

数据结构1 线性结构

孤街浪徒 提交于 2019-12-05 05:09:41
数据结构是指数据元素的结合及元素间的相互关系和构造方法。元素之间的相互关系是数据的逻辑结构,元素关系的存储形式成为存储结构。数据结构按照逻辑关系的不同分为线性结构和非线性结构两大类。其中线性结构是最基本的结构,元素顺序排列,常见的有线性表、栈、队列、数组、串。 一、线性表 1.线性表是最简单也是最常用的一种线性结构。一个线性表示n(n>=0)个元素的有限序列,非空线性表的特点为: 存在唯一的一个“第一个”元素; 存在唯一的一个“最后一个”元素; 除第一个元素外,序列中的每个元素均只有一个直接前驱; 除最后一个元素外,序列中的每个元素均只有一个直接后驱; 2.关于线性表的存储结构,有顺序存储和链式存储两种方式。顺序存储是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。链式存储则使用结点来存储数据元素,结点分为数据域和指针域,数据域用于存储元素的值,指针域则存储元素的直接前驱或直接后驱的地址,结点之间通过指针域构成一个链表。若结点中只有一个指针域,则称为单链表。 顺序存储结构无须占用额外的空间来表示元素之间的逻辑关系,而且可以随机存取表中的元素,但插入、删除数据的操作比较麻烦,需要顺次移动很多元素;链表中各数据元素的结点地址则不要求是连续的,因此必须同时存储元素之间的逻辑关系,链表的插入、删除操作都比较方便,只需修改指针域的指向即可。

数据结构那些事(二)线性表及其连续存储的实现

僤鯓⒐⒋嵵緔 提交于 2019-12-04 04:55:08
一、基本概念 首先,还是来回顾线性结构的基本概念。 线性结构: 在这些数据元素中有一个可以被称为“第一个”(元素 01 )的数据元素;还有一个可以被称为“最后一个”(元素 04 )的数据元素;除第一个元素以外每个数据元素有且仅有一个直接前驱元素,除最后一个元素以外每个数据元素有且仅有一个直接后续元素。这种数据结构的特点是数据元素之间是 1 对 1 的联系,即线性关系。 二元组表示 :一种数据结构的二元组表示为 linearity = (K,R) ,其中 K = {01, 02, 03, 04, 05} R = {<02,04>, <03,05>, <05,02>, <01,03>} 接下来我必须强调的一点,我们研究的线性表是类型相同 有限序列 。 二、线性表和数组的区别 还有一点,线性表和数组要区别一下,具体区别如下: 从概念上区别:线性表是抽象数据结构,数组是一种具体的数据类型。 从逻辑关系上区别:线性表描述的是元素和元素之间一对一的关系,而数组是下表索引和数组元素的一一对应的关系。 从物理存储上区别:线性表相邻的元素存储在内存中可以是连续的,也可以是不连续的;而数组中相邻的元素存储在连续的内存空间中。 三、线性表抽象数据类型(ADT List) 抽象数据类型是描述啥东西,有啥关系,干啥。关于啥东西。 啥东西 :数据元素在Java里面就是对象,什么对象呢?为了兼容所有对象

利用线性表的顺序结构求集合的并、交、差、补(C语言实现)

China☆狼群 提交于 2019-12-01 17:15:42
昨天用数据结构中的线性表的顺序结构实现了关于集合的并、交、差、补的集合运算,做个记录,希望也能帮助到其他人。 一、算法分析   (1)用数组A,B,C,E表示集合。假定A={1,3,4,5,6,7,9,10},   B={2,,3,4,7,8,10}, E={1,2,3,4,5,6,7,8,9,10},   输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。      (2)两个集合的并运算:把数组A中各个元素先保存在数组C中。将数组B中的元素逐一与数组A中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B的并。    C语言算法(线性表顺序结构实现): /**求集合的并集的函数**/ void Union_Sq(SqList La,SqList Lb,SqList &Lc){ int i; ElemType elem; Lc.length=0; for(i = 0; i < La.length; i++) Lc.elem[Lc.length++]=La.elem[i]; for(i = 1; i <= Lb.length; i++){ elem = Lb.elem[i-1]; if(!LocateElem_Sq(La,elem,Equal)) ListInsert_Sq(Lc,Lc.length

《大话数据结构》读书笔记系列(三)---- 线性表

牧云@^-^@ 提交于 2019-11-28 14:14:55
1、线性表:零个或多个数据元素的有限序列。 2、线性表的顺序存储结构:用一段连续的存储单元依次存放线性表的数据元素。这种结构在获取节点的值的时候非常简单,但是在插入数据元素或者删除数据元素时,前面和后面的元素都得做相应的移动,非常浪费时间。这种结构比较审核元素个数固定,不会轻易进行数据增加或者删除的情况。 下面是针对这种结构的插入删除方法: #filename:list.h #define MAXSIZE 30 typedef int ElemType; typedef struct{ ElemType data[MAXSIZE]; int length; }SqList,* pSqList; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 typedef int Status; Status InsertElem(pSqList L,int i,ElemType e); Status DeleteElem(pSqList L,int i,ElemType & e); void PrintList(pSqList L); #filename:list.cpp Status InsertElem(pSqList L,int i,ElemType e){ if(L->length == MAXSIZE){