数据结构
一条傻傻的二哈
一只正在努力奋斗的二哈
展开
-
全排列(C语言)
全排列输入一个数n,输出1-n的全排列,这里我们将其形象化,举个例子,加入有编号1、2、3的3张扑克牌分别放在3个盒子里面,并且每个盒子有且只能放一张扑克牌。那么一共有多少种放法呢?好,第一步:小张手拿三张扑克牌,首先走到1号盒子面前,我们规定一个顺序,每次到一个盒子时,都先放1号,再放2号,最后放3号,于是小张走到一号盒子前,将1号扑克牌放在了1号盒子中。接下来,小张将2号扑克牌放在...原创 2018-06-23 17:48:36 · 14390 阅读 · 3 评论 -
数据结构---堆的相关操作
数据结构—堆堆的概念如果有一个关键码的集合K = { k0,k1, k2,…,kn-1 },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足: Ki <= K2 * i+1 且 Ki <= K2 * i +2 (Ki >= K2 * i + 1 且 Ki >= K2 * i + 2) i = 0,1,2…,则称为小堆(或大堆)。小堆(大堆)...原创 2018-10-04 20:31:33 · 178 阅读 · 0 评论 -
堆排序
堆排序堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大堆和小堆,是完全二叉树。大堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] &gt;= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。堆排序利用了大根堆(或小根堆...原创 2018-10-04 23:49:51 · 174 阅读 · 0 评论 -
数据结构---哈希表的认识
哈希哈希概念顺序搜索以及二叉树搜索树中,元素存储位置和元素各关键码之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的 多次比较。搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过...原创 2018-10-05 15:03:42 · 319 阅读 · 0 评论 -
浅谈各种排序
一、直接插入排序基本思想:用我自己的话说,第一趟,前两个数比较大小,然后从小到大排序,(我的文中都是从小到大排序,从大到小排序都是一个道理);第二趟,拿起第三个数插到已经排好序的前两个数中,使他依然有序。第三趟,拿起第四个数插到已经排好序的前三个数中,使他依然有序。。。。。。好了,后面和前面一样,继续往下做就好。我举个例子初始状态:{3,6,4,2,11,10,6}第一趟排序:{(3,...原创 2018-10-05 23:21:52 · 232 阅读 · 0 评论 -
并查集的介绍和其六种优化(c++)
并查集并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题。有一个联合-查找算法定义了两个用于此数据结构的操作:Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。Union:将两个子集合并成同一个集合。如图,最简单的一种解释方法,上图中上面一行存的是元素,下面的一行存的是元素所属的集合。那么我们可以清晰的看到:其中元素0、2、4、6、8是一个组别,元...原创 2019-02-17 22:19:42 · 259 阅读 · 0 评论 -
数据结构------图(一)
关于图的简单介绍图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。在图中的数据元素,我们称之为顶点(Vertex),顶点集合有穷非空。在图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。图按照边的有无方向分为无向图和有向图。无向图由顶点和边组成,有向图由顶...原创 2019-02-18 17:37:48 · 223 阅读 · 0 评论 -
平衡二叉树---- AVL树
平衡二叉树之—AVL树为了解决二叉搜索树可能会退化成单支树,导致效率低下的情况。于是提出了,当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。AVL的条件具有以下性质的二叉搜索树:它的左右子树都是AVL树左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)于...原创 2019-04-02 09:07:37 · 196 阅读 · 0 评论 -
二叉树搜索树
简单的二叉树搜索树二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。原理:二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构...原创 2018-10-04 12:27:48 · 445 阅读 · 0 评论 -
详细解读二叉树基本操作
二叉树的详细解读二叉树的概念一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的二叉树组成二叉树的特点:每个结点最多有两棵子树,即二叉树不存在度大于2的结点二叉树的子树有左右之分,其子树的次序不能颠倒因此:二叉树是通过上述5中形式的组合或嵌套而形成满二叉树&amp;完全二叉树满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和...原创 2018-10-04 00:04:44 · 680 阅读 · 0 评论 -
使用两个队列实现一个栈
使用两个队列实现一个栈这里我就不详细介绍栈和队列这两个数据结构了,自行谷歌。队列是先进先出的数据结构,队列是先进后出的数据结构。那么我们如何实现呢?看看下面的方法先来定义的数据结构typedef struct StackB2Q{ Queue* q1; Queue* q2;}StackB2Q;对于栈的初始化:只需要初始化两个队列即可void InitStackQ2S(...原创 2018-10-03 15:17:40 · 215 阅读 · 0 评论 -
静态的顺序表(C语言实现)
我对于静态的顺序表的理解就是类似于数组来存数据。直接来看代码吧。我一步一步解释。头文件#include”SeqList.h”#ifndef __SEQLIST_H__#define __SEQLIST_H__#include<assert.h>#include<stdio.h>#include<stdlib.h>#include<...原创 2018-06-19 22:01:25 · 281 阅读 · 0 评论 -
动态的顺序表(C语言实现)
上次已经写了静态的顺序表,今天在补充一个动态的顺序表。大体思路还是一样的。请看代码。这次我就不详细解释了。#include”pSeqList.h”#ifndef __SEQLIST_H__#define __SEQLIST_H__#include<assert.h>#include<stdio.h>#include<stdlib.h>...原创 2018-06-19 22:17:41 · 251 阅读 · 0 评论 -
链表的相关面试题(完整)(C语言)
链表的相关面试题我这里是单链表,并且带头结点,其实我感觉带不带头结点都无所谓了。只要思路是正确的,那么代码实现起来相对简单。链表的基本操作我的头文件中的一些定义#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int DataType;#define M...原创 2018-07-20 14:05:02 · 424 阅读 · 0 评论 -
递归 解决汉诺塔问题(栈应用)
汉诺塔问题的来源及什么是汉诺塔问题相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上...原创 2018-07-21 23:53:37 · 5706 阅读 · 2 评论 -
浅谈各种排序
一、直接插入排序基本思想:用我自己的话说,第一趟,前两个数比较大小,然后从小到大排序,(我的文中都是从小到大排序,从大到小排序都是一个道理);第二趟,拿起第三个数插到已经排好序的前两个数中,使他依然有序。第三趟,拿起第四个数插到已经排好序的前三个数中,使他依然有序。。。。。。好了,后面和前面一样,继续往下做就好。我举个例子初始状态:{3,6,4,2,11,10,6}第一趟排序:{(3 ...原创 2018-08-01 11:56:19 · 159 阅读 · 0 评论 -
栈应用—括号匹配问题
括号匹配问题问题:假设表达式中括号可以任意嵌套,例如【()【()】】都是合法的。但是要求括号必须成对出现,像【(】)或者(【))的形式都是非法。编写一个程序,从终端输入一组括号,以字符 ‘#’ 为结束标志,判断输入的括号是否匹配合法。解决思路:1、首先输入1个字符,当该字符不是 ’#‘ 时,程序进入循环中。2、进入循环之后,首先判断栈是否为空。如果栈为空,则说明用户输入的括号字符是第一...原创 2018-09-09 23:31:29 · 403 阅读 · 0 评论 -
两个栈实现一个队列
我先来简单的介绍一下栈和队列栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任何元素的栈称为空栈,栈又称为后进先出的线性表。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表进行插入操作的一端称为队尾(入队列)进行删除操作的一端称为队头(出队列)队列具有先进先出(FIF...原创 2018-10-03 14:09:15 · 234 阅读 · 0 评论 -
栈应用---元素出栈、入栈顺序的合法性判断
利用栈来判断元素出入栈顺序的合法性例如:入栈的序列(1,2,3,4,5),出栈序列为 (4,5,3,2,1)解决思路如下:我们设置一个中间栈:tempStack,记录一个出栈顺序下标index1、按入栈顺序,存入一个元素到tempStack中2、比较tempStack的栈顶元素与出栈顺序的第index个元素比较相同,则进行3,否则进行13、弹出tempStack的栈顶元素,inde...原创 2018-10-03 14:50:08 · 524 阅读 · 0 评论 -
海量数据面试题
哈希切割给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 如何找到top K的IP?如何直接用Linux系统命令实现?采用hash的方式,ip%m,将大文件分成 m 个小文件。对每个小文件,用hash表统计ip出现的次数。找出这个小文件出现次数最多的 ip在这m个ip中,比较得到出现次数最多的ip。如果是top k的话,就维护...原创 2019-08-16 10:06:06 · 274 阅读 · 0 评论