
计算机理论基础
文章平均质量分 91
gzhosp_redAnt
互联网+医疗践行者
展开
-
挑战408——数据结构(32)——折半查找法
折半查找这种思想其实我们之前就已经接触过挑战408——数据结构(20)——二叉搜索树(BST)。这里我们同样采用相同的方式来实现在顺序表中是怎么使用这种思想来查找的。一个数组查询的实例查找问题,可以简单理解为我们有大量的数据,我们怎么样可以在这大量的数据中快速找到需要的数据?假设我们有一个已经排好序的数组:那么在这个数组中,查到我们需要的数据需要多长时间?显然,如果我们从头开始并向前查找...原创 2019-11-23 14:05:26 · 797 阅读 · 0 评论 -
挑战408——数据结构(31)——Hash表的基本操作和冲突避免
从上一篇博文我们知道,哈希表是一种以关联方式存储数据的数据结构。 在哈希表中,数据以数组格式存储,其中每个数据值都有其自己的唯一索引值。 如果我们知道所需数据的索引,则数据访问将变得非常快。因此,它成为一种数据结构,其中插入和搜索操作非常快,而与数据的大小无关。 哈希表使用数组作为存储介质,并使用哈希技术生成要在其中插入元素或从中定位元素的索引。hash表实例散列是一种将键值范围转换为数组索...原创 2019-11-21 00:09:36 · 758 阅读 · 0 评论 -
挑战408——数据结构(30)——Hash表与Hash函数
hash函数的引入在介绍hash函数之前,先说个实际的例子。我是个比较乱的男生,袜子啊,书籍什么的都乱扔。那么哪天如果要找某件东西,在最坏的情况下,你需要找遍你房间的所有角落。但是,如果你是个爱收拾的男生,那么你要找某件东西的话,直接去对应的地方去寻找就好了。如果用算法复杂度表示,那么前者就是O(N)(因为最坏的情况是你要找遍所有的地方)和后者是O(1)。我们现在思考,能不能将这样的结构用于数据...原创 2019-11-20 22:09:27 · 988 阅读 · 1 评论 -
挑战408——数据结构(29)——最短路径算法(Dijkstra's Algorithm)
在图中,给每一条路径带上一定的权重,这样的图我们称为带权图。如下图所示:带权图我们现在来回顾一下BFS跟DFS的基本思想:深度优先搜索:继续沿着路径搜索,直到我们需要回溯,但这种方式不保证最短路径。广度优先搜索:查看包含距离1的邻居,然后是距离2的邻居等的路径,直到找到路径,这种方式保证最短路径。但这两种方法都是无法处理带权图的问题。举个例子由A到D的最短路径是什么?我...原创 2019-11-20 10:28:49 · 1376 阅读 · 1 评论 -
挑战408——数据结构(28)——图的应用之拓扑排序
一个无环的有向图称为有向无环图(DAG)。图的顶点可以表示要执行的任务,并且边可以表示一个任务必须在另一个之前执行的约束; 在这个应用程序中,拓扑排序只是任务的有效序列。 当且仅当图形没有有向循环时,即如果它是有向无环图(DAG),则可以进行拓扑排序。 任何DAG都具有至少一个拓扑排序。这种用弧来表示活动之间的优先级关系的有向图,称为顶点表示的活动的网(简称AOV网)。拓扑排序(Topologi...原创 2019-11-19 22:54:38 · 787 阅读 · 0 评论 -
挑战408——数据结构(26)——广度优先搜索算法(BFS)思想
尽管深度优先搜索具有许多重要用途,但该策略也具有不适合某些应用程序的缺点。 深度优先方法的最大问题在于它从其中一个邻居出发,在它返回该节点或者是访问其他邻居之前,它必须访问完从出发节点开始的整个路径。 如果我们尝试在一个大的图中发现两个节点之间的最短路径,则使用深度优先搜索会将我们一直带到图的远端,即使我们的的目的地离我们的出发点仅有一步之遥。广度优先搜索广度优先搜索(Breadth-firs...原创 2019-11-18 10:13:55 · 898 阅读 · 0 评论 -
挑战408——数据结构(25)——深度优先搜索算法(DFS)思想
图由顶点及其边组成,图的遍历主要分为两种:遍历所有顶点遍历所有边图的遍历我们只讨论第一种情况,即不重复的列出所有的顶点,主要有两种策略:深度优先搜索(DFS),广度优先搜索(BFS)为了使深度和广度优先搜索的实现算法的机制更容易理解,假设提供了一个名为visit的函数,它负责处理每个单独节点所需的任何处理。 因此,遍历的目的是按照确定的连接顺序在每个节点上调用且仅调用一次该函数。 因...原创 2019-11-17 23:33:22 · 859 阅读 · 0 评论 -
挑战408——数据结构(24)——图的存储与矩阵压缩
图的存储方式在实践中,存储图最常见的策略是:将每个节点的连接存储在邻接列表中。将整个图形的连接存储在邻接矩阵中。用邻接链表来表示图之间的关系在图中表示连接的最简单方法是在每个节点的数据结构中存储与其连接的节点的列表。该结构称为邻接列表。 例如,在航空公司图表中每一个节点连接的相邻节点构成一个邻接表,就像这样:现在我们来讲将上图的内容抽象化:假设我们现在有个有向图:根据定...原创 2019-11-17 14:40:20 · 3137 阅读 · 1 评论 -
挑战408——数据结构(23)——树与图
我们先回顾一下之前介绍的树的概念,在树的定义中,每个节点只能有一个父类,并且树中不能出现有环形。但是你可曾想过,当一棵树没有任何规则的时候,会发生什么吗?图的简介现在,我们给图(graph)下一个定义:图,是一种用节点和边来表示相互关系的数学模型。(A graph is a mathematical structure for representing relationships using...原创 2019-11-17 13:57:42 · 873 阅读 · 0 评论 -
挑战408——组成原理(28)——系统总线
总线的基本概念计算机系统的五大部件之间连接的方式有两种,一种是各部件之间使用单独的连线,称为分散连接。一种是将各部件连到一组公共信息传输线上,称为总线连接。总线是连接多个部件的信息传输线,是各部件共享的传输介质,当多个部件与总线项链时,如果出现两个或者两个以上部件想总线发送信息,势必导致总线上的信号冲突,传输无效,因此在某一时刻,只允许有一部件发送信息,而多个部件可以从总线上接收相同信息。常...原创 2019-11-13 22:40:58 · 1383 阅读 · 0 评论 -
挑战408——数据结构(22)——平衡二叉树与AVL算法
平衡树介绍前几篇的文章我们介绍了一下二叉树和二叉搜索树。现在假设我们要建立一棵BST,依次插入下列数据:20, 33, 50, 61, 87, 99那么按照BST的规则我们可以得到下列的BST:如果你问我,这是一棵二叉搜索树吗?这肯定的。但是它更像什么?链表!有什么区别呢?数据结构不同,链表只包含一个指向下一个节点的指针,而这个包含的还有指向左节点的指针。这个时候我们看看,我们之前定义的...原创 2019-11-11 10:00:31 · 846 阅读 · 0 评论 -
挑战408——组成原理(27)——流水线的影响因素
之前说过,目前影响流水线主要的冲突有:资源冲突(结构相关),数据冲突(重点),控制冲突。结构相关多条指令进入流水线后,在同一始终周期内争用同一功能部件。这种冲突的通常解决方式为:前一个指令访存的时候,后一个指令暂停一个时钟周期(拖慢一拍),再执行。增设一个功能部件数据相关后续的指令需要的操作数,要等到前面的指令执行完成后并保存结果后才能获得。数据相关主要分为三种情况:RA...原创 2019-11-06 22:28:01 · 1093 阅读 · 0 评论 -
挑战408——数据结构(21)——二叉搜索树的插入和删除
在二叉搜索树种最重要的就是插入和删除操作了二叉搜索树的插入我们要在二叉搜索树中执行各种操作的前提就是,我们首先要有一棵二叉搜索树。那么,如何创建一棵二叉搜索树呢?最简单的方法就是我们可以从一棵空树开始,每次调用一个addNode函数,将一个新的值插入二叉搜索树中。但是在每次插入的时候我们都要保持树的一个排序关系,因此我们要做的就是在插入的时候,找到我们要插入的值应该在的位置。因此和遍历的代码...原创 2019-11-06 21:22:03 · 430 阅读 · 0 评论 -
挑战408——数据结构(20)——二叉搜索树(BST)
在之前的文章中,我们提到过三叉树,n叉树,但是我们实际用的最多却是二叉树,因为这样的结构更适合我们编程和更适合我们使用递归的方式。所以我们可以限制孩子的数量使得生成的树更容易实施。那么怎么定义二叉树呢?树中的每个节点至多有两个孩子。除根节点之外的每个节点均被指定为其父项的左侧子项或右侧子项。第二个条件强调了二叉树中的子节点相对于其父母排序。也就是说当子节点的顺序不一样的时候,他们就不是一...原创 2019-11-05 21:36:27 · 510 阅读 · 0 评论 -
挑战408——数据结构(19)——树的遍历(先序,中序,后序)
树的存储结构之前我们提到过堆是一棵特殊的树,在堆的存储方式中,我们选择了数组的方式去存储。因为只要知道一个节点的位置我们就能找到其他的节点的位置。但是前提是堆是一棵完全二叉树。树的结构多种多样,没人规定说一个节点只能有一个孩子。我们先看下图,一个最简单的二叉树:怎么表达?看到箭头,我们应该立马反应过来一个基本的工具,没错就是指针,应该立马反应过来一个数据结构,那就是链表!把value换...原创 2019-11-05 19:19:27 · 821 阅读 · 0 评论 -
挑战408——数据结构(18)——二叉堆的建立与排序算法分析
堆的建立与排序堆的建立我们在刚刚提到过一个问题:我们所有的操作都是建立在一个已经建好的堆中,但是现实中,我们怎么可能那么轻松就得到一个建好的堆呢,所以我们还是得自己在一堆毫无规律的数组中,自己建立一个二叉堆。那么构建堆的最好方式是什么呢?(也就是我们怎么写一个**builtHeap()**的方法)假设我们要把下面的一组数构建成二叉堆:当然我们可以想到的第一个办法就是,利用我们刚刚讨论的...原创 2019-11-04 23:56:34 · 652 阅读 · 0 评论 -
挑战408——数据结构(17)——优先队列与二叉堆
优先队列我们回顾之前我们学过的队列,队列中的元素按照特定的顺序进行储存,并只能先进先出。然而,在现实生活中,我们却想把元素按照一定的优先级储存起来。举个现实中的例子:我们平时坐高铁,会有所谓的头等舱,二等舱,普通舱。在银行排队,总会有vip客户提前办理业务所谓优先队列(priority queue),就是把元素按照一定的优先级储存起来,而不是根据特定的顺序。因此,它与我们之前接触的基于...原创 2019-11-03 17:34:16 · 617 阅读 · 0 评论 -
挑战408——数据结构(16)——树的概念
从这一篇开始,进入一种新的数据结构,称为树。其实在学习树之前我们就接触过这个结构。树的概念现在我们从一幅图中来了解一下什么是树状结构:这幅图主要说明cart这个单词的所有可能的组合结构,按照常理,我们先考虑三个字母的排列,然后由三个字母的排列中再进行拆分,最后重复拆分直到仅有一个字母。这个套路是不是很像我们之前学过的devide —— conquer算法?对的,这是一个递归的过程,也是计算...原创 2019-11-01 18:30:00 · 609 阅读 · 0 评论 -
挑战408——数据结构(15)——线性结构(6)
线性结构的基本介绍到了这里就暂时告一段落。这篇文章主要是用来总结线性结构的一些特点跟应用的。线性结构是数据结构中的最基础的结构,以下的数据结构都是基于这个结构的。尤其是链表,树跟图的结构都可以由此衍生出来。链表的遍历模式通过之前的学习,我们知道我们当时写moveCursorBackward时,是通过遍历链表来找到cursor之前的一个...原创 2019-10-31 22:19:12 · 360 阅读 · 0 评论 -
挑战408——数据结构(14)——线性结构(5)
前篇讨论了一下具体的链表结构以及常规操作。现在我们趁热打铁,感觉再来熟悉一下具体的操作。此时我们用链表的形式来实现之前的顺序栈。链栈栈结构这里不多说,我们直接进入正题。先考虑,当栈为空的时候,如何表示?当然就是一个空指针了将新元素推入堆栈时,该元素只会添加到链表的前端。因此,如果将元素e1 push到空栈上,该元素将存储在一个新单元格中,该单元格将成为链中唯一的链接:将一个新元素pus...原创 2019-10-31 10:58:52 · 354 阅读 · 0 评论 -
挑战408——数据结构(13)——线性结构(4)
通过上篇的学习,我们可以知道作为为编辑器buffer,他们可以快速的找到编辑器的第一位和最后一位,但是插入和删除某个元素的时候,却是可能很慢。因此为了改进这个问题,我们有必要了解为什么以前的方法会使得插入和删除变得这么慢(因为通常使用编辑器的时候,插入和删除的操作往往更频繁)。在数组实现的情况下,答案是显而易见的:因为当我们在buffer中插入一些新文本时,必须移动大量字符。例如,假设你尝试补全...原创 2019-10-30 16:06:56 · 407 阅读 · 0 评论 -
挑战408——数据结构(12)——线性结构(3)
前两篇文章介绍了基于数组的栈跟队列的实现。数组是一种顺序表的结构,所谓顺序表,就是线性表的顺序存储,它用一组地址连续的存储单元,一次存储线性表中的数据,使得逻辑上相邻的两个元素在物理上也相邻。主要特点是表中元素的逻辑顺序跟物理顺序相同。由于物理顺序相同,通过首地址跟元素序号就可以直接在O(1)的时间内找到元素,这种访问方式称为随机访问方式。但是这种存储方式,在插入和删除元素方面又显得复杂很多了,因...原创 2019-10-28 23:06:47 · 375 阅读 · 0 评论 -
挑战408——数据结构(11)——线性结构(2)
我们提到过一个叫栈(stack)的数据结构,它是一种符合最后一个进栈的元素一定会是第一个出栈的元素(LIFO),这种机制在计算机编程中是非常有用的,因为它反映了我们编程中函数调用的机制。然而在现实生活中却显得限制太多而且无用。队列的概念在人类社会中,我们的公平的集体概念赋予了先发制人的优先权,如“先到先得”所表达的那样。在编程中,这种策略的通常称为是“先到先得” ,缩写为FIFO。使用FIF...原创 2019-10-27 21:17:22 · 377 阅读 · 0 评论 -
挑战408——数据结构(10)——线性结构(1)
结合原创 2019-10-27 16:15:10 · 922 阅读 · 0 评论 -
挑战408——数据结构(9)——插入排序算法
还有几种排序算法,也表现出跟选择排序算法一样的算法复杂度O(N^2)。我们现在分析其中的一种,称为插入排序算法。插入排序算法插入排序的操作很简单,跟选择排序一样,它需要遍历所有的元素。但是与选择排序不同,选择排序是找到最小的数,然后与剩下的第一个数交换位置。而插入排序则是遍历所有元素,然后将剩余的元素逐个按顺序插入到已经排好序的vector中。再次考虑我们之前排序示例中使用的数据,下面图解插...原创 2019-10-26 14:31:32 · 542 阅读 · 0 评论 -
挑战408——数据结构(8)——快速排序算法性能分析
先先看看排序算法的C++代码实现:#include <iostream>#include <vector>using namespace std;/*函数原型*/void sort(std::vector<int> &vec);void quickSort(std::vector<int> & vec, int start...原创 2019-10-24 21:34:44 · 901 阅读 · 0 评论 -
挑战408——数据结构(7)——快速排序算法
本章前面介绍的合并排序算法在理论上表现良好,也具有O(N log N)的最差情况复杂度,实际上并没有太多的应用。 相反,目前使用的大多数排序程序都是基于由英国计算机科学家C.A.R.(Tony)Hoare开发的称为Quicksort的算法.。快速排序原理Quicksort和合并排序都采用分治法。在合并排序算法中,原始vector被分为两部分,每一个被独立排序。 然后将所得到的排序向量合并在一起...原创 2019-10-24 11:46:22 · 993 阅读 · 0 评论 -
挑战408——数据结构(6)——标准复杂类
合并算法的算法复杂度上一篇,我们可以通过分治法实现了排序功能,现在我们来分析一下它的算法复杂度。按照以前的分析方式,调用合并排序算法来对一组含N个数的vector进行排序的时候,运行时间可以分为下面两个部分:执行非递归调用所需要的的时间。执行递归调用所需要的的时间。我们先看非递归调用的时间,在递归调用sort函数之前,我们需要对N个vector中的数据进行分解,然后将分解的数据填充到两...原创 2019-10-24 10:14:30 · 512 阅读 · 0 评论 -
挑战408——数据结构(5)——合并算法
从之前的学习可以看到,对大型vectory要求的排序,选择排序算法显然不符合要求,因为运行时间与输入问题规模大小的平方成比例增加,对于以线性顺序处理向量的元素的大多数排序算法也是如此。 所以要采用不同的方法来开发更好的排序算法。我们可以试着反过来思考。强大的分治法(divide-and-conquer)分治法的具体详见C++抽象编程——递归简介(1)——递归范式我们先来看看排序算法的性能为...原创 2019-10-23 22:57:35 · 1204 阅读 · 1 评论 -
挑战408——数据结构(4)——Big-O表示法(2)
最坏情况与平均复杂度上篇讨论的都是算法的运行时间直接取决于问题规模的大小N,但是在某些情况下,算法的运行时间不仅取决于问题的大小,还取决于代码的特定特性,看下面一段代码:int linearSearch(int key, Vector<int> & vec) { int n = vec.size(); for (int i = 0; i < n; i+...原创 2019-10-23 20:33:16 · 1339 阅读 · 0 评论 -
挑战408——数据结构(3)——Big-O表示法
对比上篇的文章,通常对于数值型的操作,通常可以用数值的本身来反映问题的规模。对于大多数的关于数组或者vector的算法,通常参与运算的数的多少本身就代表了问题的规模。在评估算法效率过程中,我们通常用字母N来表示问题规模的大小,当N逐渐增大时,N与算法性能之间的关系称为算法复杂度(The relationship between N and the performance of an algorit...原创 2019-10-23 00:09:13 · 1913 阅读 · 0 评论 -
挑战408——数据结构(2)——选择排序算法
151原创 2019-10-22 11:54:17 · 2022 阅读 · 0 评论 -
挑战408——数据结构(1)——个人的一些学习方法
在开篇之前,先说说这个计算机考研的核心课程。数据结构这一门课程,是公认的最难也是最重要的课程。难是难在目前国内的教程对这些结构介绍的过于抽象,没有实际的运行示例。直接上数据结构思想,这让一般的同学是不好接受的,有种听着就懂,一看就懵的感觉。索性本人在学习数据结构的过程中,比较幸运的以一份国外的教材和PPT进行学习,此篇总结的难度可能比考研的略简单,但是重在思想方法的介绍。这篇总结是基于之前《数据结...原创 2019-10-21 21:59:21 · 2715 阅读 · 0 评论 -
挑战408——一周网络——网络层(2)
划分子网分类的IP地址也称为两级IP地址(网络号,主机号)。这样的分类有几点不好的地方:IP地址空间利用率低。试想A类地址能表示(2^31)个网络地址,全球的主机数远不止如此。每个物理网络都分配一个网络号,会使得路由表过大。二级地址不够灵活。划分子网就是为了解决这些问题的。具体的思路如下:一个拥有许多物理网络的单位,可以将所属的物理网络划分成子网,这样的子网只对单位内可见,对外仍...原创 2019-10-21 11:33:01 · 399 阅读 · 0 评论 -
挑战408——一周网络——网络层(1)
IP网网络层应该向运输层提供什么样的服务?互联网采用的思路是这样的:网络层向上只提供简单灵活的,无连接的,尽最大努力交付的数据报(这里的数据报就是IP分组)服务。网络层不提供服务质量的承诺,也就是说,所传送的分组可能出错,可能丢失也可能重复或者失序。网际协议IP是是TCP/IP协议中最重要的两个协议之一,与IP协议配套的还有三个协议:地址解析协议(ARP协议)网际控制报文协议(ICMP协...原创 2019-10-20 20:52:41 · 453 阅读 · 0 评论 -
挑战408——组成原理(2)——二进制数和十六进制数
这算是数据的表示运算这一部分的第一篇文章了,这部分多且繁杂,因为我们通常都是以10进制的数进行计算和表示的,用了10几年,突然接受一种新的表示方式难免会导致理解困难。初学这章我也是半懵逼状态的,好在复习了一轮后,又去多次问了老师相应的问题,才算有个大致的了解。所以这系列的文章如果有不对的地方,欢迎批评指正。这篇是基础篇,是学习后面的各种运算的基础,所以得好好看,好好理解。从10进制->2......原创 2019-10-18 11:42:13 · 836 阅读 · 0 评论 -
挑战408—— 操作系统(2)——用户态与内核态
操作系统内核操作系统的内核是指在计算机硬件上扩充的第一层软件。通常是一些与硬件紧密相关的模块。内核的实现是通过原语实现的,而原语又是由原子操作构成的。原语是由若干指令构成的,用于完成一定功能的过程。而原子操作是指在这过程中的行为 ,要么全做,要么不做,不可中断(以保证操作的完整性)。操作系统主要包含以下功能:时钟管理(以后会讲)中断处理(下篇会讲)原语操作(刚刚提到的)核心态与用...原创 2019-10-18 10:42:21 · 1196 阅读 · 2 评论 -
挑战408——操作系统(1)——介绍一下操作系统这个东西
在开篇我们提到过,操作系统的工作就相当于管理者的工作。操作系统是一种系统软件,它的任务是控制和管理计算机系统中的资源(包括硬件和软件资源)。控制是说系统要合理的组织和调度计算机的工作和资源的分配并且提供给用户和其他软件方便的接口环境。操作系统不是单一的程序,它是一个程序集合。操作系统的特征操作系统是一种系统软件,主要的特点有并发性,共享性,虚拟性,不确定性。 - 并发性。并发性是指两个或者两个...原创 2019-10-18 10:36:00 · 1084 阅读 · 0 评论 -
挑战408——组成原理(1)——看看我们要学什么
计算机的发展历程我一直觉得,要想深入理解,学习一门课程,就必须了解一下它的发展史,尤其是计算机发展对比其他的专业来说可以说是相当的晚了。才100多年历史。所以有机会我一定要好好看看这100年计算机都发生了什么。 言归正传。世界上第一台计算机是1946年在美国诞生的ENIAC。1945年,冯诺依曼提出了存储程序的思想:必须将事先编好的原始程序和数据一同送入主存后,才能执行程序,一旦程序被执行,计算......原创 2019-10-18 08:50:03 · 1046 阅读 · 0 评论 -
挑战408——一周网络——运输层(4)
TCP的可靠传输(数据传输)TCP的流量控制如果发送方发送的数据速率过快,那么接收方就很可能来不及接收那么多的数据报。所谓流量控制,就是让发送方不要发送那么快,至少要让接收方来的即接收。利用滑动窗口机制可以很方便的实现对TCP流量的控制。这里注意,rwnd的值不等于缓存区的大小。分析一下,假设B的初始接收窗口为rwnd= 400,也就是 一开始允许A最多发400字节的数据。第一第二条表示...原创 2019-10-17 00:15:04 · 474 阅读 · 0 评论