随笔分类 -  DataStructures&Algorithms

学习笔记:用Python来实现的数据结构与算法
摘要:理解HashMap底层,首先应该理解Hash函数 从解决一个问题入手:大量的数据要存储查询,构造哈希表来解决 初步想法 借鉴数组下标访问的思路来做,只需知道起始位置和下标值, 不管数组中有多少个元素,都可以一次访问到, 将元素和元素位置建立一种一一对应的关系 Hash函数的出现 输入的元素的范围可能 阅读全文
posted @ 2018-11-01 11:51 kumata 阅读(1066) 评论(0) 推荐(0)
摘要:在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS)。 DFS(深度优先搜索)算法 Depth-First-Search 深度优先算法,是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。 当节点v 阅读全文
posted @ 2018-06-30 16:59 kumata 阅读(920) 评论(0) 推荐(0)
摘要:本篇学习笔记内容为图的各项性质、图的表示方法、图ADT的python实现 图(Graph) 是数据结构和算法学中最强大的框架之一(或许没有之一)。图几乎可以用来表现所有类型的结构或系统,从交通网络到通信网络,从下棋游戏到最优流程,从任务分配到人际交互网络,图都有广阔的用武之地。 我们会把图视为一种由 阅读全文
posted @ 2018-06-30 11:19 kumata 阅读(3172) 评论(0) 推荐(0)
摘要:本篇学习内容为堆的性质、python实现插入与删除操作、堆复杂度表、python内置方法生成堆。 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙;而栈像一个直立垃圾桶,一列下来。 堆(heap) 又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队 阅读全文
posted @ 2018-06-19 22:45 kumata 阅读(34657) 评论(0) 推荐(0)
摘要:本篇学习笔记记录二叉查找树的定义以及用python实现数据结构增、删、查的操作。 二叉查找树(Binary Search Tree) 简称BST,又叫二叉排序树(Binary Sort Tree),是对称顺序的二叉树,支持多种动态集合操作。 二叉树也是: 空 两个不相交的二叉树(左和右) 对称顺序 阅读全文
posted @ 2018-06-11 23:17 kumata 阅读(2322) 评论(0) 推荐(0)
摘要:树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树、FP-树。 本篇学习笔记来自:二叉树及其七种遍历方式、python遍历与非遍历方式实现二叉树 介绍: 树的遍历主要有两种,一种是深度优先遍历,像前序、中序、后序;另一种是广度优先遍历,像层次遍历。 阅读全文
posted @ 2018-06-11 21:09 kumata 阅读(606) 评论(0) 推荐(0)
摘要:树 在计算机科学中,树是分层结构的抽象模型 。本篇学习笔记记录树的内容如下: 树的基本功能:定义、术语、ADT 树的遍历方法:前序、中序、后序 树的定义 第一种:树由一组节点和一组连接节点的边组成。树具有以下属性: 树的一个节点被指定为根节点。 除了根节点之外,每个节点 n 通过一个其他节点 p 的 阅读全文
posted @ 2018-06-11 19:42 kumata 阅读(553) 评论(0) 推荐(1)
摘要:哈希表(Hash table) 众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。 使用哈希表可以进行非常快速的查找操作,查找时间为常数,同时不需要元素排列有序;py 阅读全文
posted @ 2018-06-08 21:58 kumata 阅读(26873) 评论(0) 推荐(2)
摘要:本篇我以队列的数据类型和操作方法两个方面总结学习笔记 队列(Queue) 一种先进先出(FIFO)的线性数据结构,插入操作在队尾(tail)进行,删除操作在队首(head)进行。 列可以通过(循环)数组或链表轻松实现 一、数据类型 Queue() 创建队列 enqueue(item) 向队尾插入项 阅读全文
posted @ 2018-06-07 17:18 kumata 阅读(724) 评论(0) 推荐(0)
摘要:本篇我以堆栈的数据类型和操作方法两个方面总结学习笔记 堆栈(Stack) 一种后进先出(LIFO)的线性数据结构,对堆栈的插入和删除操作都只能在栈顶(top)进行。 堆栈可以通过数组和链表轻松实现 一、数据类型 Stack() 创建堆栈 push(item) 向栈顶插入项(平时的insert) / 阅读全文
posted @ 2018-06-07 16:31 kumata 阅读(1036) 评论(0) 推荐(0)
摘要:链表(Linked List) 很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,由于python是动态语言,可以直接把对象赋值给新的变量,于是在python一切皆为对象的原理上实现链表的各项操作。 在实现链表python类的属性和方法操 阅读全文
posted @ 2018-06-06 20:16 kumata 阅读(36792) 评论(3) 推荐(2)
摘要:在前面的排序算法学习中,归并排序和快速排序就是用的分治法,分治法作为三大算法之一的,有非常多的应用例子。 分治法概念 分治法特征 第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加; 第二条特征是应用分治法的前提它也是大多数问题可以满足的,此特征反映了递归思想的 阅读全文
posted @ 2018-06-05 17:34 kumata 阅读(6184) 评论(0) 推荐(0)
摘要:承接上一篇:查找:顺序查找与二分法查找,将二分法更多详细的python实现解题写下笔记。 简单方法 改进方案:如果我要找一个数组中相同数字最前面的那个数字。比如lis = [1,2,2,2,2,3,3,5,6],用上面的代码会返回index为4,下面代码解决如何返回相同元素的最前一个 经典方法 下面 阅读全文
posted @ 2018-06-03 23:27 kumata 阅读(1512) 评论(0) 推荐(0)
摘要:快速排序( Quick sort) 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行递归排序,以达到整个序列有序。 1.算法描述: 另一个分而治之 将数组划分为两个部分,然后独立地对部分进行排序: 首先选择一个 阅读全文
posted @ 2018-06-01 22:26 kumata 阅读(518) 评论(0) 推荐(0)
摘要:归并排序( Merge sort),也成合并排序、二分排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序 阅读全文
posted @ 2018-06-01 21:24 kumata 阅读(495) 评论(0) 推荐(0)
摘要:计数排序( Count sort) 一个不需要比较的,类似于桶排序的线性时间排序算法。该算法是对已知数量范围的数组进行排序。其时间复杂度为O(n),适用于小范围集合或重复元素多的排序。计数排序是用来排序0到100之间的数字的最 好的算法。 1.算法描述: “抽屉原理” 找出待排序的数组中最大和最小的 阅读全文
posted @ 2018-06-01 18:40 kumata 阅读(395) 评论(0) 推荐(0)
摘要:希尔排序( Shell sort) 插入排序的改进版本,其核心思想是将原数据集合分割成若干个子序列,然后再对子序列分别进行直接插入排序,使子序列基本有序,最后再对全体记录进行一次直接插入排序。 我的面向人类的理解:挑选间隔为k的数进行排序,然后不断缩小k,最终降到1,此时相当于插入排序。 1.算法描 阅读全文
posted @ 2018-05-31 23:44 kumata 阅读(269) 评论(0) 推荐(0)
摘要:插入排序( Insert sort) 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入; 由于不需要全部都比较完,所以排序速度优于冒泡和选择排序。 #插入排序就像是斗地主摸牌 1.算法描述: 2.算法属性: 时间复杂度:O(n^2) 空间复杂度:O(1) 稳定性:稳定 阅读全文
posted @ 2018-05-31 23:18 kumata 阅读(227) 评论(0) 推荐(0)
摘要:选择排序( Selection sort) 1.算法描述: 通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录进行交换。 对尚未完成排序的所有元素,从头到尾比一遍,记录下最小的那个元素的下标,也就是该元素的位置, 把该元素交换到当前遍历的最前面。 阅读全文
posted @ 2018-05-31 22:21 kumata 阅读(209) 评论(0) 推荐(0)
摘要:冒泡排序(Bubble sort) 两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止。 1.算法描述: 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤, 阅读全文
posted @ 2018-05-30 23:14 kumata 阅读(355) 评论(0) 推荐(0)