算法与数据结构

20182333 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结

耗尽温柔 提交于 2019-12-03 09:51:07
20182333 2019-2020-1 《数据结构与面向对象程序设计》第七周学习总结 教材学习内容总结 第十二章 算法分析 1.算法效率(决定着一个程序执行的速度) 2.增长函数与大O符号。增长函数表明问题大小(n)与希望优化的值之间的关系。该函数表示时间复杂度或空间复杂度。渐进复杂度称为算法的阶。记为O(n) 第十四章 栈 1.集合分为两大类:①线性集合:按照顺序一个一个排。②非线性集合:存在顺序并列的情况。 2.栈是一种线性集合,元素按后进先出(LIFO)的方法进行处理,有push,pop,peek,isempty,size等常用操作 3.栈是用于计算后缀表达式的理想数据结构,在进行运算时,先把中缀表达式转为后缀表达式,然后从左到右扫描,数字入栈,遇见符号,把前两个数字进行相应的运算然后放入栈中(减法是第二个数减去栈顶的数)。 4.链式结构是基于数组的集合实现的主要代替方案,链表是一种链式结构,自引用式构成了链表的基础,在链表中存储的对象通常泛称为结点node 5.链表会按需动态增长,因此本质上,它没有容量限制 6.使用链表实现的栈和使用数组实现的栈一样,都需要写出相应的push、pop等方法。 第十五章 队列 1.队列是一种线性集合,元素从一段加入从另一端删除(先进先出)。 2.队尾(tail),队首(head),队列前端(front),队列末端(rear)。 3

go map数据结构和源码详解

别说谁变了你拦得住时间么 提交于 2019-12-03 07:58:52
目录 1. 前言 2. go map的数据结构 2.1 核心结体体 2.2 数据结构图 3. go map的常用操作 3.1 创建 3.2 插入或更新 3.3 删除 3.4 查找 3.5 range迭代 3.5.1 初始化迭代器mapiterinit() 3.5.2 迭代过程mapiternext() 4. go map的扩容缩容 4.1 扩容缩容的基本原理 4.2 为什么叫“伪缩容”?如何实现“真缩容”? 5 Q&A关键知识点 5.1 基本原理 5.2 时间复杂度和空间复杂度分析 1. 前言 本文以go1.12.5版本分析,map相关的源码在runtime包的map开头的几个文件中,主要为map.go。 go的map底层实现方式是hash表(C++的map是红黑树实现,而C++ 11新增的unordered_map则与go的map类似,都是hash实现)。go map的数据被置入一个由桶组成的有序数组中,每个桶最多可以存放8个key/value对。key的hash值(32位)的低阶位用于在该数组中定位到桶,而高8位则用于在桶中区分key/value对。 go map的hash表中的基本单位是桶,每个桶最多存8个键值对,超了,则会链接到额外的溢出桶。所以go map是基本数据结构是hash数组+桶内的key-value数组+溢出的桶链表 当hash表超过阈值需要扩容增长时

最基础的数据结构-左轻侯

一曲冷凌霜 提交于 2019-12-03 06:07:53
作者:左轻侯 创建时间:2007-03-04 22:29:06 最后修改时间:2008-01-18 22:07:52 本文发表于《程序员》2007年第3期      最基础的数据结构   左轻侯   2007.2.3      引言       任何一个受过专业训练的程序员,对“数据结构”这门课程中涉及到的各种数据结构都不会感到陌生。但是,在实际的编程工作中,大部分的数据结构都不会用到,而且也许永远都不会用到。造成这种现象的原因有二:一是根据80/20法则,常用的数据结构只会占到少部分;二是计算机语言往往已经对常用的数据结构进行了良好的封装,程序员不需要关心内部的实现。    虽然如此,深入地理解基本数据结构的概念和实现细节,仍然是每一个程序员的任务。这不仅是因为,掌握这些知识,将有利于更加正确和灵活地应用它们,而且也是因为,对于语言背后的实现细节的求知欲,是一个优秀的程序员的素质。    本文将讨论实际编程最经常使用的三种数据结构:字符串、数组和Hash表,比较它们在不同语言中的实现思路,并涉及它们的使用技巧。      字符串    严格地说,字符串(string)甚至不能算作一种单独的数据结构,至少在C语言中,它仅仅是某种特定类型的数组而已。但是,字符串在实际使用中是如此重要,在不同语言中的实现又差异颇大,因此,它值得被作为一种抽象数据类型单独进行讨论

数据结构与算法---汉诺塔

给你一囗甜甜゛ 提交于 2019-12-03 03:17:05
#include<stdio.h> void Hanoi(int n,char a,char b,char c) { if(n==1) printf("move %c to %c \n",a,c); else { Hanoi(n-1,a,c,b); printf("move %c to %c \n",a,c); Hanoi(n-1,b,a,c); } } void main() { int n; char A = '1',B = '2',C = '3'; printf("enter the number of disks"); scanf("%d",&n); printf("the solution for n = %d\n",n); Hanoi(n,A,B,C); } 来源: CSDN 作者: yinhua405 链接: https://blog.csdn.net/yinhua405/article/details/70232223

笔记:数据结构与算法

隐身守侯 提交于 2019-12-03 02:31:02
数据结构与算法 常用排序算法 实现比较丑陋,勿喷啊 冒泡排序 :从前向后比较相邻的元素。如果前一个比后一个大,就交换他们两个,每一轮把一个最大的数运到数组最后面。 public static int[] sort(int[] arr) { int len = arr.length; // 冒泡总次数 for (int i = 1; i < len; i++) { boolean flag = true; // 每次冒泡过程 for (int j = 0; j < len - i; j++) { if (arr[j] > arr[j + 1]) { MyUtils.swap(arr, j, j + 1); flag = false; } } if (flag) { // 如果一个冒泡过程没改变,退出返回已经有序 break; } } return arr; } 选择排序 :每次从未排序数组中找一个最小的元素,放到以有序数组后面 public static int[] sort(int[] arr) { int len = arr.length; // 选择次数 for (int i = 0; i < len - 1; i++) { int min = i; // 每次选择过程 for (int j = i + 1; j < len; j++) { if (arr[j] < arr

JAVA数据结构和算法 6 递归

老子叫甜甜 提交于 2019-12-03 02:11:29
递归:直接或者间接地调用自己。比如计算连续数的阶乘,计算规律:n!=(n-1)!*n。 每个递归方法都有一个基值(终止)条件,以防止无线地递归下去,以及由此引发的程序崩溃。 采用递归是因为它可以从概念上简化问题,递归算法结构清晰、可读性强,且容易采用数学归纳法证明算法正确性。然而时间花费和空间花费都比非递归算法更大。 关于递归与分治: 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题与原问题相同且相互独立。 递归地解这些子问题 ,然后将各子问题的解合并得到原问题的解。 使用分治思想设计出的算法一般是递归算法, 所以分治问题的时间复杂度也可以用递归方程来分析 。 关于递归与回溯: 回溯也是一种算法思想,可以用递归实现。通俗点讲回溯就是一种试探,类似于穷举,但回溯有“剪枝”功能。 来源: https://www.cnblogs.com/lsh0908/p/11770783.html

数据结构――一些概念

匿名 (未验证) 提交于 2019-12-03 00:39:02
数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系 图状结构或网状结构 结构中的数据元素之间存在多对多的关系 物理结构/存储结构:数据在计算机中的表示。物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、哈希结构)等 在数据结构中,从逻辑上可以将其分为线性结构和非线性结构 数据结构的基本操作的设置的最重要的准则是, 实现应用程序与存储结构的独立 。实现应用程序是“逻辑结构”,存储的是“物理结构”。逻辑结构主要是对该结构操作的设定,物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、希哈结构)等。 顺序存储结构中,线性表的逻辑顺序和物理顺序总是一致的。但在链式存储结构中

C#数据结构―树和二叉树

匿名 (未验证) 提交于 2019-12-03 00:34:01
 线性结构中的数据元素是一对一的关系,树形结构是一对多的非线性结构,非常类似于自然界中的树,数据元素之间既有分支关系,又有 层次关系。 树形结构在现实世界中广泛存在,如家族的家谱、一个单位的行政机构组织等都可以用树形结构来形象地表示。树形结构在计算机领域中也有着非常广泛的应用,如 Windows 操作系统中对磁盘文件的管理、编译程序中对源程序 的语法结构的表示等都采用树形结构。 在数据库系统中,树形结构也是数据的重要组织形式之一。树形结构有树和二叉树两种,树的操作实现比较复杂,但树可以转换为二叉树进行处理,所以,我们主要讨论二叉树。 一:树 1.1树的定义    树(Tree)是 n(n≥0)个相同类型的数据元素的有限集合。树中的数据元素叫结点(Node)。n=0 的树称为空树(Empty Tree);对于 n>0 的任意非空树 T 有:   (1)有且仅有一个特殊的结点称为树的根(Root)结点,根没有前驱结点;     (2)若n>1,则除根结点外,其余结点被分成了m(m>0)个互不相交的集合T 1 ,T 2 ,…,T m ,其中每一个集合T i (1≤i≤m)本身又是一棵树。树T 1 ,T 2 ,…,T m 称为这棵树的子树(Subtree)。    由树的定义可知,树的定义是递归的,用树来定义树。因此,树(以及二叉树)的许多算法都使用了 递归 。   树的形式定义为:树

算法与数据结构(11)―― 堆排序(原地排序)

匿名 (未验证) 提交于 2019-12-03 00:22:01
原地排序: 之前两种的都是从索引1开始计算的,而原地排序不需要额外的辅助空间,即不用去创造堆,那么索引从0开始的~ 注意一下 最后一个非叶子结点的索引是(count - 2)/ 2 public class HeapSort { private HeapSort() { } public static void sort(Comparable[] arr){ int n = arr.length; // 注意,此时我们的堆是从0开始索引的 // 从(最后一个元素的索引-1)/2开始 // 最后一个元素的索引 = n-1 for( int i = (n-1-1)/2 ; i >= 0 ; i -- ) shiftDown2(arr, n, i); // ---- 此时已经形成一个堆了 ---- for( int i = n-1; i > 0 ; i-- ){ swap( arr, 0, i); shiftDown2(arr, i, 0); } } // 交换堆中索引为i和j的两个元素 private static void swap(Object[] arr, int i, int j){ Object t = arr[i]; arr[i] = arr[j]; arr[j] = t; } // 原始的shiftDown过程 private static void shiftDown

数据结构之空间复杂度和空间复杂度

匿名 (未验证) 提交于 2019-12-03 00:22:01
空间复杂度是指 执行这个算法所需要的内存空间。 空间复杂度是函数中创建对象的个数关于问题规模函数表达式,一般情况下用O渐进表示法表示 1.忽略常数,用O(1)表示 2.递归算法的空间复杂度=递归深度*每次递归所要的辅助空间 3.对于单线程来说,递归有运行时堆栈,求的是递归最深的那一次压栈所耗费的空间的个数,因为递归最深的那一次所耗费空间足以容纳它所有递归过程。递归是要返回上一层的,所以它所需要的空间不是一直累加起来的。 时间复杂度是指 执行这个算法所需要的计算工作量。 1.用常数1取代运行时间中的所有加法常数 2.在修改后的运行次数函数中,只保留最高阶项 3.如果最高阶项系数存在且不是1,则去除与这个项相乘的常数 void Test( int n) { int iCount = 0 ; for ( int iIdx = 0 ; iIdx < 10 ; ++iIdx) { iCount++; } } //执行总次数:f(n)=10 + 1 //则O(n)=O(1) int Jie_Cheng( int n) { if (n < 2 ) return 1 ; else int i = n; int tmp = Jie_Cheng(n - 1 ); return n * tmp; } //每次递归次数:2 //递归总次数:n //2*n 所以O(n)=O(n) 文章来源: