数据结构
文章平均质量分 56
ricardoleo
韬光养晦,厚积薄发。
展开
-
数据结构:初入复杂度
算法复杂度是指算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源。算法的复杂度分为时间复杂度与空间复杂度。 时间复杂度: 先看一个代码void Test(int n){ int iCount = 0; for( int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j)原创 2018-03-11 22:33:09 · 169 阅读 · 0 评论 -
数据结构之哈希搜索结构(二)
上篇博客我们以闭散列解决哈希冲突的方式实现了哈希搜索结构。闭散列在实际操作时需要考虑一个问题就是如果插入时发现超过了负载因子,那么这个时候就不能插入了,需要扩容。扩容时,则需要创建更大的空间,并且由于空间变大,导致的可放个数变多,进而导致哈希函数所计算出关键值与对应存储位置发生改变。所以在扩容后拷贝的时候更加的麻烦。开散列解决哈希冲突同样再提出开散列之前定义哈希函数,方便查看。...原创 2018-05-21 14:57:36 · 241 阅读 · 0 评论 -
数据结构之二叉搜索树的基本操作
二叉搜索树 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。以上摘录自百度百科,简单来说,二叉搜索树就是任意一棵树,右子树最大,接下来是根节点...原创 2018-05-16 14:54:53 · 312 阅读 · 0 评论 -
排序算法:快速排序
快速排序 快速排序由 C. A. R. Hoare 在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序!都叫快速排序了,它能不快吗?快速排序是排序算法中效率最快的!!是对冒泡排序的一种改进...原创 2018-06-04 13:55:28 · 379 阅读 · 0 评论 -
哈希冲突应对之多阶哈希表
哈希表在处理数据查找、判断数据是否存在时非常的高效,但是哈希表在插入时可能会出现哈希冲突。而解决哈希冲突主要两种方式就是开散列与闭散列的解决方式,两者各有优点与缺点。而今天要说的解决哈希冲突的方式是建立多阶哈希表!多阶哈希表其实所谓多阶哈希表可以理解成多个数组,但是这些数组都是特殊的。这些数组的长度不一致,每个数组所能存储的元素个数都是一个素数(利用素数作为元素个数是避免产生哈希冲突的...原创 2018-06-04 16:23:09 · 2938 阅读 · 0 评论 -
数据结构之位图基本操作的实现
位图说到位图,我们应该都不陌生。在学习信号的时候我们知道,信号有递达表,阻塞表。而这些表都是基于位图实现的。所谓位图,就是将每个比特位都当做一种特殊的意义,其值0与1的变化代表不同的含义。使用位图最大的优点就是节省空间。位图的基本操作位图主要的基本操作:设置某一位有效(这里默认有效的含义就是对应比特位为1)设置某一位无效将位图全体置为0将位图全体置为1测试某一位是否被...原创 2018-05-23 23:48:46 · 356 阅读 · 0 评论 -
数据结构之布隆过滤器的实现
布隆过滤器 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。简单来说,布隆过滤器就是基于位图来实现的。确定某个元素是否出现在一个范围内。比如说一个字符串,无法用一个位来表示是否存在过。那...原创 2018-05-24 00:01:05 · 701 阅读 · 0 评论 -
排序算法:冒泡排序、选择排序、插入排序
在生活中出出都有排序,而且排序算法也是常常能够在学习中遇到的。今天这里,对冒泡、选择、插入这几种常见的排序方式进行实现。 话不多说,进入正题!冒泡排序对于冒泡排序来说,这种算法应该是学习过程中见到的最多的了。冒泡排序简单的来说就是每次一排序过后,将区域内最大或者最小的值冒出,简称冒泡。相比对冒泡排序大家还是深有体会的,这里对冒泡排序不做过多的赘述,直接贴上代码!下面所有的排序算法...原创 2018-05-30 15:10:36 · 291 阅读 · 0 评论 -
排序算法:希尔排序
希尔排序 希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1...原创 2018-05-30 16:16:05 · 363 阅读 · 1 评论 -
排序算法:堆排序
堆排序在数据结构之堆的基本操作这篇博客当中提到过一个堆排序。就是将一个堆的元素删除完毕过后,此时的数组内部就是一个有序的序列。堆与排序堆是一个完全二叉树,堆的任意一个节点都是以这个节点为根节点的树中的最值(最大或最小值)这样子的话,每一个堆的堆顶元素都是这个堆的最值。那么依次删除一个堆的堆顶,最后就能够得到一个有序的序列。而堆排序就是利用了堆的这个性质来进行排序的过程。思路...原创 2018-05-30 16:39:02 · 293 阅读 · 0 评论 -
数据结构之哈希搜索结构(一)
什么是哈希搜索结构 顺序搜索以及二叉搜索树中,元素存储位置和元素各关键码之间没有对应的关系,因此在查找一个元素的时候,必须要经过关键码的多次比较。所以这样的搜索效率取决于搜索过程中元素的比较次数。而我们理想的搜索方法就是不用经过任何比较,一次直接从表中得到要搜索的元素。如果能够构造一种结构,让所要查找的关键码与它的存储位置有一定的关系,那么可以根据这种关系找到其位置从而更快的找到关键...原创 2018-05-21 14:39:34 · 386 阅读 · 0 评论 -
数据结构之堆的基本操作
在实现堆的操作之前,先来明白什么是堆?堆中某个节点的值总是不大于或不小于其父节点的值堆总是一棵完全二叉树。要说到完全二叉树,直观的判断就是,层序遍历一棵树,如果树的某个节点没有右子树或者是没有子树,那么从这个节点后面的所有节点都不能够有任何子树。 接下来我们说说堆。堆分为大堆跟小堆。大堆的意思就是每一个节点都是它这个节点树的最大值。小堆同理是最小值。基本操作与实现...原创 2018-05-12 12:33:26 · 991 阅读 · 0 评论 -
数据结构之栈与队列的面试题:用两个队列实现一个栈
首先要用队列实现栈,我们主要的问题是,应该让先入队列的元素后出去,这样就是栈的操作了,那该如何操作呢? 我们这里的思路是,首先两个队列,起初在入栈的时候插入到任意一个空队列当中即可,接下来,如果入栈应该插入到一个有元素的队列当中去。在出栈的时候,应该把有元素的队列内的前n-1个元素全部入到另一个空队列内部,接着把剩下的最后一个元素出栈即可。 //实现如下#include <stdi...原创 2018-04-12 16:11:46 · 579 阅读 · 2 评论 -
数据结构之链式队列的实现
上篇我们提到了队列的基本概念与操作,这篇我们利用链表的方式来实现队列。 要用到链表,我们发现无论是头插头删还是尾插尾删都会涉及到遍历链表,所以这是不可避免的。再者,再对链表进行头部尾部处理的时候,我们应该引入一个新的指针,一个指针指向链表的头部,另一个指向尾部,这样我们就可以轻松的进行入队与出队。实现//linkqueue.h#pragma once#include &l...原创 2018-04-07 19:58:28 · 248 阅读 · 0 评论 -
数据结构之顺序队列的实现
顺序队列,即利用顺序表来是实现队列的基本操作。什么是队列?一堆人在排队的时候,肯定是队首的人先得到服务。而队尾的人则最后得到服务,同时要想进入队列只能从队尾进行进入,不能插队。所以在用顺序表来实现的时候,需要定义队列的头与队列的尾部,这样就能够更好的对尾部进行插入,头部进行取出。实现//seqqueue.h#pragma once#include <stdio.h>...原创 2018-04-07 12:30:34 · 499 阅读 · 0 评论 -
数据结构之链式栈的实现
上篇博客我们已经对栈的基本操作有了介绍,现在我们利用链表的方式来实现一下栈的基本操作。 其实利用链表更好实现栈,因为我们链表的头插与头删恰好可以与栈相对应,先进的后出,这里我们就不过多的赘述,直接进行实现即可。//linkstack.h#pragma once#include <stdio.h>#include <stddef.h>#include <...原创 2018-04-07 12:14:16 · 386 阅读 · 0 评论 -
数据结构之顺序栈的实现
今天我们来对顺序栈进行实现,首先我们要明白什么是栈,栈如同一个杯子,先进去的水必定最后倒出来。今天我们用顺序表的方式来对栈进行实现。首先顺序表是由数组进行实现的,而我们要实现栈,那么就需要知道栈的基本操作有哪些。栈的基本操作入栈、出栈、取栈顶首元素、初始化栈、销毁栈实现#pragma once#include <stdio.h>#include <std...原创 2018-04-07 12:08:29 · 393 阅读 · 1 评论 -
数据结构之双向带头节点带环链表的实现
之前我们曾实现过单向不带头结点不带环的单链表,但是发现,在运用中并不是那么的好用,因为单向链表每个元素只能找到他后面的元素,而无法对其前面进行查找,这样在实际的使用中并不好用,而双向带头结点带环链表却是非常好用,因为他有两个指针,一个可以查找到后面的元素,同样另一个也可以查到前面的元素。其实所谓双向链表,即两个指针next与prev一个指针可以向后进行遍历,一个指针可以向前,而头结点就相当...原创 2018-04-03 13:51:14 · 197 阅读 · 0 评论 -
数据结构之单链表常见面试题(一)
逆序打印单链表逆序打印单链表这里用的是递归的打印方法。void LinkListReverse(LinkNode* head){ if(head == NULL) { return;//空链表 } if(head->next == NULL) { return; } LinkListReve...原创 2018-03-27 12:22:29 · 276 阅读 · 0 评论 -
数据结构之单链表的模拟实现
链表在我们的数据结构当中可以说是非常重要的,而单单链表这一大类就分为八种链表。这八种链表是由:带头节点、不带头结点;带环、不带环;单向、双向;这些情况排列组合而来的。 而我们今天实现的则是单向不带头节点不带环链表。 所谓单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。 我们现在就来实现一下这个单链表。首先我们先在这里定义一下我们的函数类型等,指出要实现...原创 2018-03-20 17:22:19 · 311 阅读 · 0 评论 -
数据结构之顺序表的模拟实现
顺序表顺序表:用一段地址连续的存储单元依次存储数据元素的线性结构,地址连续的空间,一般情况下采用数组,但数组有静态数组和动态数组,所以顺序表分为:静态顺序表和动态顺序表。要模拟顺序表,那么我们就要清楚顺序表有哪些功能。 首先顺序表可以对其内容进行增删改。所以我们就要考虑到如何对其进行增删改,以及在不同情况下不同的应对方式。接下来我们说说模拟顺序表的思路。 首先,既然是顺序表,那...原创 2018-03-12 17:25:17 · 487 阅读 · 0 评论 -
排序算法:归并排序
归并排序 归并排序(MergeSort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。简单来说归并排序类似于对两个有序序列的合并。思路也就是说,将待排序的序列分成 N 组,然后对这 N 个组两两合并成一个新的有序序列,接着继续两两合并,直至最终只有一个有序序列结束。这个过程就是先将待排序序列分组,直...原创 2018-06-01 15:04:04 · 293 阅读 · 0 评论