数据结构

数据结构与算法(排序算法稳定性)

送分小仙女□ 提交于 2020-02-08 04:01:38
排序与搜索 排序算法(英语:sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法。 排序算法的稳定性 **稳定性:**稳定排序算法会让原本有相等键值的记录维持相对次序,也就是如果一个排序算法是稳定的,当有两个相等键值的记录R和S,且在原本的列表种R出现在S之前,在排序过的列表中R也会在S之前。 当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。 (4,1) ,(3,1),(3,7),(5,6) 在这个情况下,有可能产生两种不同的结果,一个是让相等键值的记录维持相对的次序,而另外一个则没有: (3,1),(3,7),(4,1) ,(5,6) (维持次序) (3,7),(3,1),(4,1), (5,6) (次序被改变) 不稳定排序算法可能会在相等的键值中改变记录的相对次序,但是稳定排序算法从来不会如此,不稳定排序算法可以被特别的实现为稳定。做这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个对象之间比较,(比如上面的比较中加入第二个标准,第二个键值的大小)就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而要记住这种次序通常牵涉到额外的空间负担。 来源: CSDN 作者: 阴天了 链接: https://blog.csdn.net/sun_xiao_kai

1.Numpy常用数据结构

百般思念 提交于 2020-02-08 02:40:26
1.python中 numpy 和pandas主流的工具 2.Numpy中的向量化运算使得数据处理变得更高效 3.Pandas提供了大量数据清洗的高效方法 4.在Python中,尽可能使用numpy和pandas 数据结构: 1.Numpy中常用的数据结构是ndarray格式(避免下for循环 效率低) 2.使用array函数创建,语法格式为array(列表或元组) 3.可以使用其他函数例如arrange、linspace、zeros等创建 #导入库 import numpy as np arr1=np.array([-9,7,4,3]) np.arrange(0,10,1) np.linspace(1,10,10) np.zeros(1,5) 实例代码: https://blog.csdn.net/l641208111/article/details/104212803 来源: CSDN 作者: DLANDML 链接: https://blog.csdn.net/l641208111/article/details/104210792

数据结构与算法(冒泡排序)

↘锁芯ラ 提交于 2020-02-07 23:36:40
冒泡排序 冒泡排序是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把它们交换过来。遍历数列的工作是重复的进行直到没有在需要的交换,也就是说该数列已经排序完成,这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡算法的运作如下: 比较相邻的元素,如果第一个元素大于第二个元素(升序),就交换它们两个。 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这步完成后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个 持续每次越来越少的元素重复上面的步骤,直到没有任何一堆数字需要比较。 冒泡算法分析 交换过程图示( 第一次 ): 那么我们需要进行n-1次冒泡过程,每次对应的比较次数如下图所示: Pass Comparisons 1 n-1 2 n-2 3 n-3 … … n-1 1 代码实现 def bubble_sort(alist): """冒泡排序""" for j in range(len(alist)-1): for i in range(len(alist)-j-1): if alist[i] > alist[i+1]: alist[i], alist[i+1] = alist[i+1], alist[i] return alist 时间复杂度 最优时间复杂度:O(n

扩张数据结构(动态统计树、区间树)

杀马特。学长 韩版系。学妹 提交于 2020-02-07 21:59:32
动态统计树(order-statistic tree)在每个结点附加信息的红黑树 附加属性:x.size以x为根的子树(包括树根)的(内)结点数 查找具有给定秩的元素 OS_select(T->root,i) 秩中序遍历树时输出的位置 OSTREE OS_select(OSTREE x,int i) { int r = x->left->size + 1; if (i == r) return x; else if (i < r) return OS_select(x->left, i); else return OS_select(x->right, i - r); }  确定一个元素的秩 int OS_rank(ROOT T, OSTREE x) { int r = x->left->size + 1; OSTREE y = x; while (y != T->root) { if (y == y->p->right) { r = y->p->left->size + 1 + r; } y = y->p; } return r; }   对子树规模的维护 插入:第一阶段:对根至叶子额路径上遍历的每一个结点x,都增加x.size属性,新增加结点的size=1 第二阶段:更新因旋转而size失效的两个结点 例如右旋 y->size = x->size; x->size = x-

数据结构之二叉树遍历

允我心安 提交于 2020-02-07 15:50:32
一、树的遍历操作 树的遍历:从根节点出发,按照某种次序访问树中所有结点,使得每个结点被访问一次且仅被访问一次。 遍历的实质为将树结构(非线性结构)转换为线性结构。 树通常有前序(根)遍历、后序(根)遍历和层序(次)遍历三种方式。 前序遍历: 树的前序遍历操作定义为: 若树为空,则空操作返回; 否则 (1)访问根结点;   (2)按照从左到右的顺序前序遍历根结点的每一棵子树 图中树的前序遍历序列为:A B D E H I F C G 树的后序遍历操作定义为: 若树为空,则空操作返回; 否则 ⑴ 按照从左到右的顺序后序遍历根结点的每一棵子树; ⑵ 访问根结点。 图中树的后序遍历序列: D H I E F B G C A 树的层序遍历操作定义为: 从树的第一层(即根结点)开始,自上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。 图中树的层序遍历序列: A B C D E F G H I 二、二叉树的遍历操作 前序(根)遍历: 若二叉树为空,则空操作返回; 否则: ①访问根结点; ②前序遍历根结点的左子树; ③前序遍历根结点的右子树。 图中二叉树的前序遍历序列:A B D G C E F 中序(根)遍历: 若二叉树为空,则空操作返回; 否则: ①中序遍历根结点的左子树; ②访问根结点; ③中序遍历根结点的右子树。 图中二叉树的中序遍历序列:D G B A E C F 后序(根

【数据结构】顺序栈

荒凉一梦 提交于 2020-02-07 15:46:43
  利用顺序存储方式实现的栈称为顺序栈。类似于顺序表的定义,栈中的数据元素用一个预设的足够长度的一维数组来实现:datatype data[MAXSIZE],栈底位置可以设置在数组的任一个端点,而栈顶是随着插入和删除而变化的,用一个 int top 来作为栈顶的指针,指明当前栈顶的位置,同样将 data 和 top 封装在一个结构中。   顺序栈的类型描述如下: typedef struct { datatype data[MAXSIZE]; int top; }seqStack;   定义一个指向顺序栈的指针: SeqStack *s;   通常0下标端设为栈底,这样空栈时栈顶指针 top=-1;入栈时,栈顶指针加1,即 s->top++;出栈时栈顶指针减1,即 s->top--。   以下是栈的几种基本操作:   (1) 置空栈 seqStack *init_seqStack() { seqStack *s; s = (seqStack *)malloc(sizeof(seqStack)); s->top = -1; return s; }   (2) 判栈空 int empty_seqStack(seqStack *s) { if (s->top == -1) { return TRUE; } return FALSE; }   (3) 判栈满 int full

ArrayList数据结构及主要方法分析

a 夏天 提交于 2020-02-07 14:18:53
/** * Shared empty array instance used for default sized empty instances. We * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when * first element is added. */ private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; 可以看出ArrayList的是基于数组的型式实现的 1.ArrayList的初始空间大小 进入ArrayList源码中可以看到声明的初始容量(default capacity) /** * Default initial capacity. */ private static final int DEFAULT_CAPACITY = 10; 从源码中我们可以得到ArrayList的初始容量为10 2.ArrayList的add()——>append操作(在最后追加) /** * Appends the specified element to the end of this list. * * @param e element to be appended to this list *

数据结构之队列的使用 + 面试题

ε祈祈猫儿з 提交于 2020-02-07 14:05:15
数据结构之队列的使用 + 面试题 队列(Queue):与栈相对的一种数据结构, 集合(Collection)的一个子类。队列允许在一端进行插入操作,而在另一端进行删除操作的线性表,栈的特点是后进先出,而队列的特点是先进先出。队列的用处很大,比如实现消息队列。 Queue 类关系图,如下图所示: 注:为了让读者更直观地理解,上图为精简版的 Queue 类关系图。本文如无特殊说明,内容都是基于 Java 1.8 版本。 队列(Queue) 1)Queue 分类 从上图可以看出 Queue 大体可分为以下三类。 双端队列:双端队列(Deque)是 Queue 的子类也是 Queue 的补充类,头部和尾部都支持元素插入和获取。 阻塞队列:阻塞队列指的是在元素操作时(添加或删除),如果没有成功,会阻塞等待执行。例如,当添加元素时,如果队列元素已满,队列会阻塞等待直到有空位时再插入。 非阻塞队列:非阻塞队列和阻塞队列相反,会直接返回操作的结果,而非阻塞等待。双端队列也属于非阻塞队列。 2)Queue 方法说明 Queue 方法如下图所示: 其中比较常用的方法有以下几个: add(E):添加元素到队列尾部,成功返回 true,队列超出时抛出异常; offer(E):添加元素到队列尾部,成功返回 true,队列超出时返回 false; remove(Object):删除元素,成功返回 true

数据结构-----3.栈:

落爺英雄遲暮 提交于 2020-02-07 11:25:12
1.特点:遵循 “先进后出”的规则,栈主要包含两个操作,“入栈” 和 “出栈”,栈这种数据结构有两种实现方式:1.数组实现,2.链表实现。例如:浏览器的前进和后退功能就可以使用 两个栈 来实现,程序中函数的调用也是通过栈来实现。 基于数组实现的叫做“顺序栈”,基于链表实现的叫做“链式栈”。 空间复杂度的概念:除了必须存储数据的空间外,还需要在程序运行时,需要额外的空间。在栈的入栈和出栈过程中,所需要的空间复杂度为O(1)。 /* * 使用数组来实现一个空间大小固定的栈*/ public class ArrayStack<E> { /*定义一个数组*/ private Object[] elementData; /*该栈空间的大小*/ private int size; /*当前栈中存储元素的个数*/ private int count; public ArrayStack(int size) { this.elementData = new Object[size]; this.size = size; this.count = 0; } /* * 入栈操作*/ public boolean push(Object element) { /*栈中的数组空间如果不够了,那么直接返回false. * 因为count是从0开始的,size是从1开始的,所以当count == size时

【Python数据结构与算法笔记day36】7.2. 二叉树的遍历+深度优先遍历+ 广度优先遍历(层次遍历)

吃可爱长大的小学妹 提交于 2020-02-07 10:36:43
文章目录 7.2. 二叉树的遍历 二叉树的遍历 深度优先遍历 广度优先遍历(层次遍历) 7.2. 二叉树的遍历 二叉树的遍历 树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历, 深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。 深度优先遍历 对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。 那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做先序遍历(preorder),中序遍历(inorder)和后序遍历(postorder)。我们来给出它们的详细定义,然后举例看看它们的应用。 先序遍历 在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树 根节点->左子树->右子树 def preorder ( self , root ) : """递归实现先序遍历""" if root == None : return print root . elem self . preorder (