数据结构与算法
文章平均质量分 85
LinBigCat
个人邮箱:
展开
-
数据结构与算法系列5--链表
什么是链表?1.和数组一样,链表也是一种线性表。2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。3.链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。常用链表:1.单链表1)每个节点只包含一个指针,即后继指针。2)单链表有两个特殊的节点,即首节点和尾节点。为什么...原创 2018-10-12 12:10:51 · 249 阅读 · 0 评论 -
数据结构与算法系列15(上)--散列表(哈希表)
什么是散列表散列表的英文是“Hash Table”,也叫“哈希表”或者“Hash 表”。他是一种根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。散列表的思想散列表用的是数组支持按照下标进行随机访问的时候,时间复杂度是O(1)的特性。所以散列表其实是数组的一...原创 2018-11-11 23:57:50 · 215 阅读 · 0 评论 -
数据结构与算法系列15(下)--散列表(哈希表)
WWW原创 2018-11-13 23:32:37 · 168 阅读 · 0 评论 -
数据结构与算法系列13--二分查找
什么是二分查找?二分查找算法是一种针对有序集合的查找算法,也叫折半查找。实现原理每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0。(特别注意前提是针对有序的数据集合)时间复杂度二分查找是一种非常高效的查找算法,他的时间复杂度是O(logn),我们可以假设数据大小是n,每次查找后数据都会缩小为原来的一半,也就是会除以2。最坏情况下,...原创 2018-11-08 22:59:37 · 395 阅读 · 0 评论 -
数据结构与算法系列16--哈希算法
什么的哈希算法?将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。而通过原始数据映射后得到的二进制值串就是哈希值。一个优秀的哈希算法应该满足哪几点?从原始数据计算得到的哈希值,不能反向推导出原始数据的值。对输入的数据非常敏感,只要对原始数据做一点改变,小到一个Bit的改变,最后得到的哈希值都大不相同。散列冲突的概率要很小,对于不同的数据,哈希出来的哈希值相同...原创 2018-11-17 21:46:28 · 419 阅读 · 0 评论 -
数据结构与算法系列17--二叉树
什么是二叉树?二叉树是每个结点最多有两个子树的树结构,它是最常见的一种树结构。一些基本概念根节点:树的最顶端是节点,如图中的1节点父节点:图中1就是2和3的父节点子节点:相对的,2和3就是子节点兄弟节点:在同一父节点下,像2和3就是兄弟节点叶子节点:没有子节点的节点,像8,9节点的高度:节点到叶子节点的最长路径节点的深度:根节点到这个节点所经历的边的个数节点的层数:节点的深度...原创 2018-11-28 23:44:27 · 634 阅读 · 0 评论 -
数据结构与算法系列18--红黑树
红黑树是平衡二叉查找树的一种,上一节我们已经讲过二叉查找树的定义,那什么是平衡二叉查找树呢?什么是平衡二叉查找树定义:平衡二叉查找树严格的定义是:二叉树中任意一个节点的左右子树的高度相差不能大于+1。从这个定义来看,的完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。目的:发明平衡二叉查找树这类数据结构的初衷是,解决普通二叉查找树在频繁的插入、删除等动态更新的...原创 2018-12-01 12:00:35 · 185 阅读 · 0 评论 -
数据结构与算法系列21--深度和广度优先搜索
图原创 2018-12-26 23:14:53 · 401 阅读 · 0 评论 -
数据结构与算法系列19--堆
1111原创 2018-12-10 23:00:48 · 191 阅读 · 0 评论 -
数据结构与算法系列20--图
图的概念在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。树中的元素我们称为节点,图中的元素我们就叫作顶点(vertex)。图中的一个顶点可以与任意其他顶点建立连接关系。我们把这种建立的关系叫作边(edge)。上面的那个图的边是没有方向的,我们称为无向图。什么是无向图中的度?跟顶点相连接的边的条数我们就称为度。另外还有一种有方向的图,我们称为有向图。例如玩过微...原创 2018-12-25 22:05:21 · 206 阅读 · 0 评论 -
数据结构与算法系列23--Trie树
我们在使用搜索引擎进行搜索时,会发现当我们输入一部分内容后,搜索引擎会弹出很多关键词提示,如果发现有你要查找的内容,你可以直接选中它进行搜索,一定程度上节省了我们的时间。究竟如何实现这种功能呢,它使用的底层数据结构和算法是什么呢?没错,就是今天要说的Trie树。Trie树也叫“字典树”,根据它名称,它本身就是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查...原创 2019-01-10 21:49:42 · 335 阅读 · 0 评论 -
数据结构与算法系列14-跳表
什么是跳表?点对点一、什么是跳表?为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。如下图所示,其中down表示down指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这种为链表建立多级索引的数据结构就称为跳表。二、跳表的时间复杂度?1.计算跳表的高度如果链表有n个节点,每2个节点抽取抽出...原创 2018-11-11 13:26:44 · 197 阅读 · 0 评论 -
数据结构与算法系列15(中)--散列表(哈希表)
如何设计一个散列函数?1.散列函数的设计不能太复杂,否则会消耗很多计算时间,也就影响了散列表的性能。2.散列函数生成的值要尽可能的随机并且均匀分布,这样才能最小化散列冲突,即便发生冲突,散列到每个槽里的数据也会比较平均,不会出现某个槽里数据太多的情况。装载因子的选择上一节我们讲过,装载因子越大,说明散列表中的元素越多,空闲位置越小,散列冲突的概率就越大。那我们怎样解决这个问题呢?可以通过设...原创 2018-11-12 21:52:23 · 319 阅读 · 0 评论 -
数据结构与算法系列11--桶排序、计数排序、基数排序
线性排序算法介绍1.线性排序算法包括桶排序、计数排序、基数排序2.线性排序的算法的时间复杂度为:O(n)3.此三种排序算法都不涉及元素之间的比较操作,是非基于比较的排序算法。4.对要排序的数据要求很苛刻,只能适用在某些特殊场景,所以重点掌握此3钟算法的适用场景。桶排序算法原理:将要排序的数据分到几个有序的桶里,每个桶里再单独进行快速排序。桶内排完序后,再把桶内的数据按照顺序依次取出组...原创 2018-11-04 21:27:12 · 178 阅读 · 0 评论 -
数据结构与算法系列6--栈
什么是栈?1.后进者先出,先进者后出,这就是典型的“栈”结构。2.从栈的操作特性来看,是一种“操作受限”的线性表,只允许在端插入和删除数据。什么时候使用?当某个数据集合只涉及在某端插入和删除数据,且满足后进者先出,先进者后出的操作特性时,我们应该首选栈这种数据结构。栈的数组实现(自动扩容)时间复杂度分析:根据均摊复杂度的定义,可以得数组实现(自动扩容)符合大多数情况是O(1)级别复杂度...原创 2018-10-14 23:27:44 · 316 阅读 · 0 评论 -
数据结构与算法系列7--队列
什么是队列?1.先进者先出,这就是典型的“队列”结构。2.支持两个操作:入队enqueue(),放一个数据到队尾;出队dequeue(),从队头取一个元素。所以,和栈一样,队列也是一种操作受限的线性表。队列的应用也非常广泛,特别是一些具有某些额外特性的队列,比如循环队列、阻塞队列、并发队列。它们在很多偏底层系统、框架、中间件的开发中,起着关键性的作用。实现队列的两种方式?顺序队列和链式队...原创 2018-10-18 11:59:42 · 178 阅读 · 0 评论 -
数据结构与算法系列8--递归
什么是递归?1.方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。2.递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。3.基本上,所有的递归问题都可以用递推公式来表示,比如f(n) = f(n-1) + 1;f(n) = f(n-1) + f(n-2);f(n)=n*f(n-1);递归的优缺点?优点:...原创 2018-10-18 15:25:16 · 152 阅读 · 0 评论 -
数据结构与算法系列1--简介
为什么要学习数据结构和算法?1.直接好处是能够有写出性能更优的代码2.算法,是一种解决问题的思路和方法,有机会应用到生活和事业的其他方面。3.长期来看,大脑思考能力是个人最重要的核心竞争力,而算法是为数不多的能够有效训练大脑思考能力的途径之一。如何抓住重点,系统高效地学习数据结构与算法?什么是数据结构?什么是算法?从广义上讲,数据结构就是指一组数据的存储结构。算法就是操作数据的一组方法...原创 2018-10-09 23:29:27 · 156 阅读 · 0 评论 -
数据结构与算法系列2--复杂度分析(上)
什么是复杂度分析?1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。4.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。为什么要进行复杂度分析?1.和性能测试相比,复杂度分析有不依赖执行环境(测试环境中硬件的不同会...原创 2018-10-10 00:02:45 · 150 阅读 · 0 评论 -
数据结构和算法系列3--复杂度分析(下)
复杂度分析的4个概念1.最坏情况时间复杂度:代码在最理想情况下执行的时间复杂度。2.最好情况时间复杂度:代码在最坏情况下执行的时间复杂度。3.平均时间复杂度:用代码在所有情况下执行的次数的加权平均值表示。4.均摊时间复杂度:在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别...原创 2018-10-10 22:02:01 · 118 阅读 · 0 评论 -
数据结构与算法系列4--数组
什么是数组?数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。数组的一个最大特性就是支持下标随机访问数组元素。补充:线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简...原创 2018-10-10 23:25:14 · 136 阅读 · 0 评论 -
数据结构与算法系列10--排序算法(归并、快排)
归并排序思想:归并排序的核心思想还是蛮简单的。如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。#归并排序def merge_sort(a): n=len(a) merge_sort_between(a,0,n-1)def merge_sort_between(a,low,high)...原创 2018-10-25 10:02:04 · 217 阅读 · 0 评论 -
数据结构与算法系列9--排序算法(冒泡、插入、选择)
#冒泡排序,优化版本def bubbleSort(data_list):n=len(data_list)if n<=1:returnfor i in range(n): flag=False#记录是否存在交换,提前退出冒泡循环的标志位 for j in range(n-1-i): if data_list[j]>data_list[j+1]:...原创 2018-10-24 08:59:06 · 283 阅读 · 0 评论 -
数据结构与算法系列12--排序优化
如何选择合适的排序算法?**这里有前面讲过的各种算法是时间复杂度的对比图,大家可以看看下。如果我们要选择一个通用的排序算法,前面讲到的线性排序算法显然是不合适的,因为它的适用场景非常有限,尽管他是速度最快的。如果对于小规模数据可以选择时间复杂度O(n^2的算法),但是对于大规模数据,则应该选择时间复杂度为O(nlogn)的算法更加高效。所以为了兼容任意规模的数据的排序,我们一般选择时间复杂...原创 2018-11-06 20:42:23 · 207 阅读 · 0 评论 -
数据结构与算法系列22--字符串匹配算法
字符串匹配这样的函数,在很多编程语言中都提供了字符串的查找算法,那它底层具体是怎么实现的呢?字符串的匹配算法有很多,简单一点的:BF算法和RF算法。高级一点的,BM算法和KMP算法。...原创 2019-01-08 23:21:54 · 261 阅读 · 0 评论