数据结构

线性表顺序存储的一些操作(初始化,添加,删除)

岁酱吖の 提交于 2020-03-03 20:03:01
最近有时间学一些自己想学的,就找来看看数据结构。看的是大话数据结构。之前学数据结构是大一时候,现在看这个还可以,没那时候学的累。但是还是需要进行一些总结,以免自己会忘记。 虽然大部分和书上差不多,但是不自己动手敲,还是会有问题。或者有些地方自己这样写会好理解一些。 一.线性表顺序存储 线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。 接下来我们对线性表结构进行了解 # define MAXSIZE 200 typedef struct { Elemtype data [ MAXSIZE ] ; int length ; } Sqlist ; 这里的长度指的是线性表长度,是线性表中数据元素的个数。我们对线性表进行操作,这个量是变化的。 其实线性表的顺序存储就是数组,但是这个长度是变化的,可以这么理解。 二.一些操作 1.初始化线性表 Sqlist * InitList ( int n , int t ) { Sqlist * L ; L = ( Sqlist * ) malloc ( sizeof ( Sqlist ) ) ; L -> length = n ; for ( int i = 0 ; i < n ; i ++ ) L -> data [ i ] = t * i ; return L ; } 这里的t是随便给的值,n是长度。 2.获得元素

【软件测试】4.编程数据结构python学习day01、day02

痞子三分冷 提交于 2020-03-03 17:28:52
1.3 Python 语言介绍 1.3.4 Python 语言的优缺点 易学. Python 有极其简单的语法, 学习极其容易上手 开源 可移植性. Python 已经被移植在许多平台上. 这些平台包括 Linux、 Windows、 Mac OS、Windows 甚至还有Android 平台 丰富的库. Python 标准库确实很庞大. 除了标准库以外,还有许多其他高质量的库 1.4 Python 开发环境搭建 编辑 Python 代码的编辑器 运行 Python 代码的解释器 1.4.3 Python 解释器 + 集成开发环境 (IDE) 我们使用 PyCharm hello print('hello world') 2. Python 基础语法 学习目标 : 1. 能够说出注释的作用以及使用注释的语法 2. 能够说出什么是标识符、什么是关键字 3. 能够说出变量的作用 4. 能够说出变量类型的作用 5. 能够说出不同类型的数据之间的运算规则 6. 能够说出 Python 中的运算符的种类 7. 能够说出 print 函数的作用 8. 能够说出 input 函数的作用 9. 能够说出为什么要进行类型转换 10. 能够说出在 Python 中如何定义变量 11. 能够说出 if 分支语句的作用 12. 能够说出 if 语句的语法格式 13. 能够说出 while 循环语句的作用

数据结构-快速排序 归并排序

£可爱£侵袭症+ 提交于 2020-03-03 16:03:46
文章目录 归并排序 (Merge sort) 简介 代码 性能分析 快速排序(Quick sort) 简介 代码 性能分析 排序算法的结合 总结 注:所有的代码在我的 Github 中有均具体C++代码实现。 这里主要讲的是时间复杂度为O(nlogn)的两种排序算法:快速排序(Qiuck sort)和 归并排序 (Merge sort)。 这两种排序都是用了分治的思想,我们因此可以借鉴这个思想来解决非排序的一些问题,例如: 如何在O(n)的时间复杂度内查找一个无序数组中的第K大的元素? 归并排序 (Merge sort) 简介 简单地说,如果要排序一个数组,我们首先吧数组从中间分成前后两个部分,然后对前后两个部分分别排序,最后将排序好的两部分进行合并。 这里使用了分治的思想,也就是分而治之,将一个大问题分成几个小的子问题来解决,小的问题解决了,大的问题也就解决了。 这里,主要就是merge函数的实现问题了, merge(A[p...r], A[p...q], A[q+1...r]) 也就是将已经有序的 A[p...q] 和 A[q+1...r] 合并成一个有序的数组,这里我们使用了一个额外的临时数组,其空间带下为 r - p + 1 ,具体操作如下: 代码 void merge(int arr[], int l, int m, int r) { int n = r - l + 1;

HBase数据结构

匆匆过客 提交于 2020-03-03 08:00:23
1. RowKey 与NoSql数据库一样,RowKey是用来检索记录的主键,访问HBase 表中的行,只有三种方式: 1. 通过单个RowKey访问(get) 2. 通过RowKey的范围(正则,like) 3. 全表扫描(scan) RowKey:可以是任意字符串(最大长度64KB,实际应用中长度一般为 10-100bytes),在HBase内部,RowKey保存为 字节数组 。 数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分利用 排序存储 这个特性,将经常一起读取的行存储放到一起。(位置相关性) 2. ColumnFamily 列族:HBASE表中的每个列,都归属于某个列族。 列族是表的schema的一部 分(而列不是),必须在使用表之前定义(创建表时,必须指定列族)。 列名都以列族作为前缀。例如: 'info:name', 'info:sex' 都属于 info 这个列族。 3. Cell 由{RowKey, Column Family,VERSION} 唯一确定的单元,cell中的数据是没有类型的,全部都是 字节码 形式存储. 4. TimeStamp HBASE 中通过rowkey和columns确定的为一个存贮单元称为cell。每个 cell都保存 着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。

数据结构-栈和队列-顺序链

孤街浪徒 提交于 2020-03-03 06:00:56
栈 栈 是一种特殊的 线性表 ,对于这种线性表规定他的 插入 运算和 删除 运算均在线性表的同一端进行,进行插入和删除的那一端称为 栈顶 ,另一端称为 栈底 。栈的插入操作也分别简称 进栈 和 出栈 。 如果栈中由n个结点{k1,k2,…kn},称k1为 栈底 ,kn为 栈顶 。 栈具有 后进先出 或 先进后出 (FILO)的性质。 顺序栈 一般的,可以设置一个足够大的移位数组存储栈,数组中下标为0元素的就是栈底,对于栈顶,可以设一个指针top指示它。 栈的顺序存储结构 # define MAXSIZE 100 typedef int datatype ; typedef struct { datatype a [ MAXSIZE ] ; int top ; } sequce_stack ; sequce_stack st ; 栈的初始化 viod init ( sequce_stack * st ) { st -> top = 0 ; } 判断栈是否为空 int empty ( aequce_stack st ) { ruturn ( st . top ? 0 : 1 ) ; } 取栈顶结点值 datatype read ( sequence_stack st ) { if ( empty ( st ) ) { printf ( "栈是空的!\n" ) exit ( 1 ) ;

基础数据结构之链表

♀尐吖头ヾ 提交于 2020-03-03 03:40:28
单链表 :链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素中的引用字段链接在一起。 双链表 :与单链表不同的是,双链表的每个结点中都含有两个引用字段。 链表的优点如下 : 链表能灵活地分配内存空间; 能在 O(1)时间内删除或者添加元素,前提是该元素的前一个元素已知,当然也取决于是单链表还是双链表,在双链表中,如果已知该元素的后一个元素,同样可以在O(1) 时间内删除或者添加该元素。 链表的缺点是 : 不像数组能通过下标迅速读取元素,每次都要从链表头开始一个一个读取; 查询第 k 个元素需要 O(k) 时间。 **应用场景:**如果要解决的问题里面需要很多快速查询,链表可能并不适合;如果遇到的问题中,数据的元素个数不确定,而且需要经常进行数据的添加和删除,那么链表会比较合适。而如果数据元素大小确定,删除插入的操作并不多,那么数组可能更适合。 相关LeetCode经典的练习题请关注公众号,从『菜单-算法-数据结构』对应文章中获取。 来源: CSDN 作者: BaryLeo 链接: https://blog.csdn.net/weixin_41878312/article/details/104619822

PYTHON数据结构与算法学习笔记(六)

[亡魂溺海] 提交于 2020-03-03 02:52:56
目录 树与树算法 树的概念 树的存储与表示 二叉树 二叉树的性质 二叉树的创建 二叉树的遍历 广度优先遍历(层次遍历) 深度优先遍历 树与树算法 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 1、每个节点有零个或多个子节点; 2、没有父节点的节点称为根节点; 3、每一个非根节点有且只有一个父节点; 4、除了根节点外,每个子节点可以分为多个不相交的子树。 例 : 树的术语 1、 节点的度 :一个节点含有的子树的个数称为该节点的度; 2、 树的度 :一棵树中,最大的节点的度称为树的度; 3、 叶节点或终端节点 :度为零的节点; 4、 父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 5、 子节点 :一个节点含有的子树的根节点称为该节点的子节点; 6、 兄弟节点 :具有相同父节点的节点互称为兄弟节点; 7、 节点的层次 :从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 8、 树的高度或深度 :树中节点的最大层次; 9、 堂兄弟节点 :父节点在同一层的节点互为堂兄弟; 10、 节点的祖先 :从根到该节点所经分支上的所有节点;

数据结构-插入排序

末鹿安然 提交于 2020-03-03 00:54:18
1、插入排序 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 我们预留了一个哨兵,这里我们将用到它来保存一个临时值。插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。 插入排序的算法步骤如下: 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; 将新元素插入到该位置后; 重复步骤2~5。 #include <stdio.h> void InsertSort(int* p, int n) { int temp,i,j; for (i = 0; i < n; i++) //每个元素都需要来插入,故比较n次 { temp = p[i]; //设置哨兵,为针对的第i个元素 for (j = i - 1; (j >= 0) && (p[j] > temp); j--) /

数据结构-二叉树的层次遍历18

纵然是瞬间 提交于 2020-03-03 00:21:17
二叉树的层次遍历 之前我已经讲解过了二叉树的先序遍历,中序遍历、后序遍历今天来看一个层次遍历,就以下面的树为例子吧,层次遍历就是一层一层的遍历,下图的层次遍历的结果是1,2,3,4,5,6,7那就看代码吧! # include <iostream> # include <queue> using namespace std ; typedef struct BiTNode { int data ; struct BiTNode * lchild , * rchild ; //左孩子 右孩子 } BiTNode , * BiTree ; void cengcibianli ( BiTNode * T , queue < BiTNode * > & m_que ) { if ( T ) { m_que . push ( T ) ; } BiTNode * temp { nullptr } ; while ( ! m_que . empty ( ) ) { temp = m_que . front ( ) ; m_que . pop ( ) ; if ( temp ) { printf ( "%d " , temp -> data ) ; m_que . push ( temp -> lchild ) ; m_que . push ( temp -> rchild ) ; } } }