算法与数据结构

数据结构(复习排序算法)——选泡插

点点圈 提交于 2019-11-29 03:41:59
#include <stdio.h> /** * 插入排序(优化) * 平均时间复杂度:O(n^2) * 平均空间复杂度:O(1) * 思想理念:从前到后进行循环,从后到前循环, * 如果前比后大,用一个下标记住,循环结束之后 * 进行交换 **/ void insertion_sort_update(int a[],int len){ for(int i=1;i<len;i++){ int j,tmp=a[i]; for(j=i;j>0&&tmp<a[j-1];j--){ a[j]=a[j-1]; } a[j]=tmp; } } /** * 插入排序 * 平均时间复杂度:O(n^2) * 平均空间复杂度:O(1) * 思想理念:从前到后进行循环,从后到前循环, * 如果前比后大,那么交换 **/ void insertion_sort(int a[],int len){ for(int i=1;i<len;i++){ for(int j=i;j>0&&a[j]<a[j-1];j--){ int tmp=a[j]; a[j]=a[j-1]; a[j-1]=tmp; } } } /** * 选择排序 * 平均时间复杂度:O(n^2) * 平均空间复杂度:O(1) * 思想理念:从前到后进行选择,选择最小 * 与最开始的数字进行交换 **/ void selection_sort

【数据结构与算法】(十)堆

大城市里の小女人 提交于 2019-11-29 03:19:25
堆是一个完全二叉树 用数组表示 a[1]表示堆顶数据 i是非叶子节点, 左节点是i*2 右节点是i*2+1 堆化函数(主要目的是保证某个非叶子节点以下的所有子节点都满足堆结构定义) private static void heapify(int[] a, int n, int i) { //i表示节点序号(非叶子节点) while (true) { int maxPos = i; if (i*2 <= n && a[i] < a[i*2]) maxPos = i*2; if (i*2+1 <= n && a[maxPos] < a[i*2+1]) maxPos = i*2+1; if (maxPos == i) break; swap(a, i, maxPos); i = maxPos; } }  插入 删除 堆排序 1建堆 2排序 来源: https://www.cnblogs.com/jiwen/p/11442082.html

数据结构与算法之树

∥☆過路亽.° 提交于 2019-11-29 03:19:20
树除了根节点之外每个结点只有一个父节点,根节点没有父节点,除了叶结点之外所有结点都有一个或多个子节点,叶节点没有子节点,父节点和子结点之间用指针连接。 一般大部分都是二叉树,即每个结点最多只能有两个子结点。遍历方式有三种:前序(根-左-右)、中序(左-根-右)、后序9左-右-根); struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; }; 1 重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历都不含有重复的数字。 BinaryTreeNode *Construct(int *preorder, int *inorder, int length); 解题思路: (1)根据preorder的第一个数字,遍历inorder找到该数字,即确定了根结点的位置; (2)inorder中根结点左边为左子树,右边为右子树,再结合preorder就找到左子树和右子树对应的前序序列和中序序列; (3)用同样的方法分别去构建左子树和右子树,即用递归完成; 2 未完待续~ 来源: https://www.cnblogs.com/bo1990/p/11442056.html

数据结构--循环队列

穿精又带淫゛_ 提交于 2019-11-29 01:00:26
一.顺序队列的改进 队列元素的出列是在队头,即下标为0的位置,那也就意味着, 队列 中的所有元素都得向前移动,以保证队列的队头(也就是下标为0的位置)不为空,此时的时间复杂度为0(n)。 可有时想想,为什么出队列时一定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这一条件,出队的性能就会大大增加。也就是说,队头不需要一定在下标为0的位置,比如也可以是a[1]等。 而为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,引入两个指针,front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样当front等于rear时,此队列不是还剩一个元素,而是空队列。 对于队列 最好的方法是使用链表实现 ,因为对于数组来说,队列可能会出现下面这种情况: 假设是长度为5的数组,初始状态,空队列如所示,front与 rear指针均指向下标为0的位置。然后入队a1、a2、a3、a4, front指针依然指向下标为0位置,而rear指针指向下标为4的位置。 出队a1、a2,则front指针指向下标为2的位置,rear不变,如下图所示,再入队a5,此时front指针不变,rear指针移动到数组之外。嗯?数组之外,那将是哪里? 问题还不止于此。假设这个队列的总个数不超过5个,但目前如果接着入队的话,因数组末尾元素已经占用,再向后加,就会产生数组越界的错误,可实际上

1、数据结构基础

南笙酒味 提交于 2019-11-29 00:18:50
1、 常用术语 1.1. 数据 数据是信息的载体,是能够被计算机识别、存储的符号集合。 1.2. 数据元素 也称为结点,是组成数据的基本单位。 1.3. 数据项 是数据的最小单位。 1.4. 数据对象 具有相同特征的数据元素的集合,他是数据的子集。 1.5. 数据结构 是计算机存储、组织数据的方式。它描述了数据元素之间的相互关系,以及数据元素的组织形式。 1.5.1. 逻辑结构 逻辑结构是指从逻辑关系上描述数据,与数据的存储无关,且独立于语言。 就是说仅仅是从数据的逻辑关系上研究问题。 1.5.2. 存储结构 是指数据元素及其关系在计算机存储时如何表示,依赖于语言。 1.5.3. 数据运算 数据运算定义在数据的逻辑结构上,每种逻辑结构都有一个运算的集合,但运算的具体实现要在存储结构上进行。 2、 数据结构分类 常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示: 我们会在接下来的章节中分类学习。 2.1. 数组 数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从 0 开始。例如下面这段代码就是将数组的第一个元素赋值为 1 。 int[] data = new int[100] ; data[0] = 1; 优点: 1 、按照索引查询元素速度快 2 、按照索引遍历数组方便 缺点: 1

python笔记-算法及数据结构3

巧了我就是萌 提交于 2019-11-28 23:11:33
1 链表 链表是一种常见的基础数据结构,不像顺序表一样连续存储数据,而是在每一个节点存储数据和下一个节点的位置信息。 链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。 2 单向链表 2.1 节点 每个节点包含两个部分:元素域和链接域,链接指向链表中的下一个节点。 第一个节点称为头结点,最后一个节点称为尾结点。 尾结点的链接域指向为空。 3 python中变量标识的本质 python中的变量维护的只是一个地址,这个地址指向的类型不同,则变量代表的类型就不同,这也是python中变量类型可以变化的原因。 4 单链表的实现 4.1 节点的实现 class SingleNode(object): def __init__(self,item): self.item=item self.next=None 4.2 单链表的实现 class SingleLindList(object): def __init__(self,node=None): self._head=node 4.3 单链表中方法的设计 注意异常情况,如首节点和尾节点的处理 注意循环的结束条件,cur!=None和cur.next!=None 5 链表与顺序表的差异 顺序表读取数据很方便,但是需要连续内存来存储。 链表访问数据需要进行遍历,但是可以更加灵活地使用不连续内存存储数据,相应地,因为除了数据外还存有地址

数据结构与算法之线性表(顺序存储)

拟墨画扇 提交于 2019-11-28 23:01:23
首先,对于数据结构,想必大家应该比较理解,但是对于它的代码实现呢?可能就有点难了。 今天有幸复习得到一些有用的学习笔记,希望能对你有用。 顺序存储(采用动态数组进行实现) 思路:首先对于一个顺序链表,就如同我们去排队买电影票一样,在物理层面上都是一个一个的连接在一起的,而逻辑层也是,所以对于这种情况,使用数组是比较好的选择,但是考虑到在存储时,不知道未来将要存储的内容大小,所以很多时候如果固定了数组大小就会造成程序的使用范围变小,所以使用动态数组是比较好的选择。我个人在学习时看了一些关于动态数组的资料,这里推荐一下这篇博客,写得还不错。 #include<stdio.h> #include<stdlib.h> #include<string.h> //动态增长内存, 策略 将存放数据的内存放在那里?堆山 //动态数组 //容量capacity表示我的这块内存空间一共可以存放多少元素 //size概念 记录当前数组中具体的元素个数 //动态数组的结构定义 typedef struct DYNAMICARRY { int* pAddr;//具体存放数据的地址(动态数组) int size;//当前有多少个元素 int capacity; //容量 容器当前的最大的容量 }Dynamic_Array; //初始化 Dynamic_Array* Init_Array() { Dynamic

浅谈数据结构—分块

孤者浪人 提交于 2019-11-28 22:59:39
数据结构—分块 分块是一种非常好理解、非常好写的数据结构。与其说分块是数据结构,倒不如说它是一种“算法”,甚至是一种“思想”。我个人认为,分块的思想和分治法很像。它们的基本实现方式都可以概括成:将一个大问题拆成若干小问题,最后求解完小问题之后将答案汇总得出大问题的答案。 分块的基本实现是这样的:对于一个长为 \(N\) 的序列,我们把它拆成 \(\sqrt N\) 个块,(当然,每块的元素数量当然是 \(\sqrt N\) 个),我们对每个块进行暴力区间维护。最后就能处理出 \(\sqrt N\) 个子问题的答案,当我们要统计一个问题区间时,我们就可以统计被这个区间完全覆盖的块的答案,对于个别超出的再进行暴力统计即可。 分块作为一种数据结构,它的实现基于暴力枚举维护。大家可能会想:这个数据结构和暴力枚举有什么区别?但分块和枚举其实是有很大区别的。这是因为分块只需要跑一遍就能处理出所有块的答案,最后统计的时候是按块统计的,而不需要再重新进行暴力。分块的时间复杂度是 \(O(NlogN)\) 的,我们算一下,就会发现它比暴力枚举快不了太多。事实上,它的确是所有区间统计数据结构中(其他的比如线段树,树状数组等)效率最低的一个,但是它有它自己的优点:易于理解,易于实现。这也是它作为一种实用数据结构存在的原因——当我们在考场上不能百分百保证自己敲出来的高级数据结构(手撸线段树等)正确

初识数据结构与算法

旧时模样 提交于 2019-11-28 22:33:48
1、什么是数据结构?   a、数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。   b、数据结构是计算机存储、组织数据的方式,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。 2、传统上,数据结构分为数据结构和逻辑结构。   a、逻辑结构是指数据对象中数据元素之间的相互关系,逻辑结构的四大形式:集合结构、线性关系、树形结构、图形结构。   b、物理结构是指数据的逻辑结构在计算中的存储形式。数据元素的存储形式有两种:顺序存储和链式存储。顺序存储是把元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的;链式结构是把数据元素存放在任意的存储单元里,这组存储单元可以连续也可以不连续,链式存储结构的数据元素存储关系并不能反应其逻辑关系,需要一个指针存放数据元素的地址,从而通过地址找到相关数据元素的的位置。 3、算法的五个基本特征:输入、输出、有穷性、确定性和可行性。算法设计的要求:正确性、可读性、健壮性、时间效率高和存储量低。 4、线性表,定义:由零个或多个数据元素组成的有限序列。若存在多个元素,第一个无前驱、最后一个无后继、其余的元素都有且仅有一个前驱和后继。 栈和队列 来源: https://www

数据结构--哈夫曼树

◇◆丶佛笑我妖孽 提交于 2019-11-28 22:27:45
Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。 定义 :给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答。 (01) 路径和路径长度 定义 :在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 例子 :100和80的路径长度是1,50和30的路径长度是2,20和10的路径长度是3。 (02) 结点的权及带权路径长度 定义 :若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。 例子 :节点20的路径长度是3,它的带权路径长度= 路径长度 * 权 = 3 * 20 = 60。 (03) 树的带权路径长度 定义 :树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。 例子 :示例中,树的WPL= 1* 100 + 2*5 0 + 3* 20 + 3* 10 = 100 + 100 + 60 + 30 =290。 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径。 ② 路径长度