-
【数据结构】将一组数据升序排序(利用堆排序)
所属栏目:[安全] 日期:2020-12-15 热度:133
堆排序相对冒泡排序、选择排序效率很高,不再是O(n^2). 假若将一个序列 升序 排序好,那么我们来考虑最大堆还是最小堆来排序。假若是最小堆的话,堆的顶端必定是堆中的最小值,这样貌似可以。但是,如果是它的(一边或)子树左子树的节点数据值大于(一边[详细]
-
【数据结构】用模版实现大小堆、实现优先级队列,以及堆排序
所属栏目:[安全] 日期:2020-12-15 热度:65
一、用模版实现大小堆 如果不用模版的话,写大小堆,就需要分别实现两次,但是应用模版的话问题就简单多了,我们只需要实现两个仿函数,Greater和Less就行了,仿函数就是用类实现一个()的重载就实现了仿函数。这个看下代码就能理解了。再设计参数的时候,需[详细]
-
【数据结构】【面试题】找N个数据中最大的K个数据
所属栏目:[安全] 日期:2020-12-15 热度:190
如果不限定条件的话,这个问题还是很好解决的,但是当我们要求时间复杂度为O(N),空间复杂度为O(1)时,问题就没那么好解决了。 简单的思路就是,创建一个大小为K=100的小堆,调整好,然后从K开始拿十万个数据一个一个跟堆头比较,如果比堆头大,就入堆,然后[详细]
-
【数据结构】之二叉树的java实现
所属栏目:[安全] 日期:2020-12-15 热度:133
二叉树的定义: 二叉树是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。 二叉树(BinaryTree)是n(n≥0)个结点的有限[详细]
-
《数据结构》队列的顺序表示--循环队列
所属栏目:[安全] 日期:2020-12-15 热度:78
/*队列的线性表示--循环队列 */ #includestdio.h#define MAXQSIZE 100/*定义顺序队列 */typedef struct{int *base;//分配存储空间 int front;//队头指针 int rear;//队尾指针 }SqQueue;//初始化循环队列 /*算法思想:循环队列的初始化就是动态分配一个预定义[详细]
-
《数据结构》队列的链式表示--链队
所属栏目:[安全] 日期:2020-12-15 热度:138
/*队列的链式表示 */#includestdio.h/*定义链式队列的存储结构 */ typedef struct QNode{int data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;/*初始化链式队列 思想:构造一个只有一个头结点的空队列,将[详细]
-
【数据结构】哈希表的线性探测算法
所属栏目:[安全] 日期:2020-12-15 热度:87
构造哈希表常用的方法是: 除留余数法 --取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址。HashKey= Key % P。 直接定址法 --取关键字的某个线性函数为散列地址HashKey= Key 或 HashKey= A*Key + BA、B为常数。 我在这里主要使用一下 除留余[详细]
-
【数据结构】处理哈希冲突的开链法(哈希桶)算法实现
所属栏目:[安全] 日期:2020-12-15 热度:155
实现哈希表时,我们常见的方法是线性探测、二次探测,这两个算法也很简单。若有兴趣,可以查看我的博客。但是,这两个算法有一个共同点就是:空间利用率低。为什么这么说呢?线性探测、二次探测的高效性很大程度上要取决于它的载荷因子,载荷因子即:存放关[详细]
-
【数据结构】位图BitMap与布隆过滤器BloomFilter
所属栏目:[安全] 日期:2020-12-15 热度:101
首先先看一下下面这个腾讯的面试题: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】 思路一: 最容易想到的解法就是遍历所有的40多亿个整数,然后一个一个判断。但是这个需要花费的内存是多大呢[详细]
-
【数据结构】位图BitMap、布隆过滤器的算法实现
所属栏目:[安全] 日期:2020-12-15 热度:60
我们先给出之前我看过的腾讯公司的一道笔试题,引出位图BitMap。 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 这个问题怎么解决呢? 1)将40亿数据保存起来(保存在数组、链表、树中),再和该数判断[详细]
-
【数据结构】两个队列实现一个栈
所属栏目:[安全] 日期:2020-12-15 热度:85
用两个栈实现一个队列,这个问题与“ 两个队列实现一个栈 ”原理非常的相似。只要你明白了”两个队列实现一个栈“的原理,相信聪明的你,就会明白这个问题只是它的变种,所有的异或就会迎刃而解的。这里大家可以参考我的博客http://www.jb51.cc/article/p-wd[详细]
-
《数据结构》2.5-将链表A分解成B和C
所属栏目:[安全] 日期:2020-12-15 热度:110
/*设计一个算法,将带头结点的单链表A分解成两个结构相同的单链表B和C使得B中的元素是A中大于等于0的元素,C中的元素是A中小于0的元素。要求存储空间仍使用A的存储空间。 */#includestdio.htypedef struct LNode{int data;struct LNode *next;}LNode,*LinkLi[详细]
-
《数据结构》2.6通过一趟遍历找出链表中的最大值
所属栏目:[安全] 日期:2020-12-15 热度:60
/*设计一个算法,通过一趟遍历,找出链表中的最大元素。 */ #includestdio.htypedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;int InitList(LinkList L){L=new LNode;L-next=NULL;return 1;}void CreateList(LinkList L,int n){L=new LNo[详细]
-
《数据结构》算法3.8栈实现数制转换
所属栏目:[安全] 日期:2020-12-15 热度:92
首先最简单的是实现10进制和2进制的转换 /*输入一个数,然后输出其对应的8进制的数 */ #includestdio.h#define MAX 1000//顺序栈存储空间最大值 //int n,m;//n表示输入的数,m表示输出的数的进制 //先定义一个顺序栈的结构typedef struct{int *base;//栈底4[详细]
-
《数据结构》10进制的数向任何进制的数进行转换
所属栏目:[安全] 日期:2020-12-15 热度:191
使用栈实现10进制的数向任何进制的数转换。 /*使用栈实现10进制到任何进制数的转化 */ #includestdio.h#define MAX 100//定义栈结构typedef struct{int *base;int *top;int stacksize;}SqStack;//初始化栈int InitStack(SqStack S){S.base=new int[MAX];if(![详细]
-
《数据结构》使用数组实现数制的转换
所属栏目:[安全] 日期:2020-12-15 热度:114
使用数组实现10进制向任何进制数制的转换。 算法思想: 使用数组模拟栈,将n%m加到数组中,然后将数组的元素倒叙输出即可。 #includestdio.hint stack[100];int n,m;//n表示要转换的数,m表示进制//初始化数组int Init(int stack[]){for(int i=0;i100;i++){s[详细]
-
【数据结构】常用排序算法(包括:选择排序,堆排序,冒泡排序,
所属栏目:[安全] 日期:2020-12-15 热度:76
直接插入排序: 在序列中 , 假设升序排序 1)从0处开始。 1)若走到begin =3处,将begin处元素保存给tmp,比较tmp处的元素与begin--处元素大小关系,若begin处begin-1处,将begin-1处元素移动到begin;若大于,则不变化。再用tmp去和begin--处的元素用同样[详细]
-
【数据结构】大量数据(20万)的快速排序的递归与非递归算法、三
所属栏目:[安全] 日期:2020-12-15 热度:91
快速排序的挖坑法与prev、cur法,我们在上一篇博客的第6个排序中讲的非常详细,http://www.jb51.cc/article/p-bmmuzqrp-bkg.html【数据结构】常用排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序) 有兴趣的话,相信聪明的你,一[详细]
-
【数据结构】常见的7种比较排序算法1
所属栏目:[安全] 日期:2020-12-15 热度:92
● 直接插入排序(Insert Sort) 1、算法描述: 该算法是一种简单直观的是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上只需用到O(1)的额外空间的排序,因而在从后向前扫描过程中,需要反复把已排序[详细]
-
【数据结构】常见的7种比较排序算法2
所属栏目:[安全] 日期:2020-12-15 热度:84
● 快速排序(Quick Sort) 1、算法描述: 在平均状况下,排序n个数据要 O(nlg(n)) 次比较。在最坏状况下则需要 O(n^2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 O(nlg(n)) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构[详细]
-
【数据结构】非比较排序算法(实现计数排序和基数排序)
所属栏目:[安全] 日期:2020-12-15 热度:145
● 计数排序 1、算法思想: 计数排序是直接定址法的变形。通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中。 2、步骤: 1)找到序列中的最大和最小数据,确定开辟的空间大[详细]
-
《数据结构》3.1双栈结构
所属栏目:[安全] 日期:2020-12-15 热度:103
题目描述: /* 题目描述:将编号0和1的两个栈存放于一个空间V[m]的数组空间中,栈底分别处于数组的两端。 当第0号栈的栈顶指针top[0]=-1时该栈为空;当第1号栈的栈顶指针top[1]=m时,该栈为空。 两个栈均从两端向中间增长。试编写双栈初始化,判断栈空,栈满[详细]
-
《数据结构》3.1双栈--按栈号进行操作
所属栏目:[安全] 日期:2020-12-15 热度:95
根据输入的栈的编号的不同,操作双栈中的其中一个: /*两个栈的编号分别为0和1,按照输入的栈号不同,操作不同的栈。假设数组左侧的栈编号为0;右端的栈编号为1. */ #includestdio.h//定义双栈结构typedef struct{int top[2],bot[2];//栈顶指针和栈底指针int[详细]
-
【数据结构】 出栈序列的合法性【面试】
所属栏目:[安全] 日期:2020-12-15 热度:181
之前我们对栈已经有所了解, 先进后出,后进先出 这是栈的两大特性,那么,我们经常会碰到这种题,例: 有一组元素abcdef,按先后顺序进栈,那么出栈时哪些情况是非法的? A. fedcba B. abdcef C. acbdef D. abcdef 选哪个呢??? 很明显,根据栈的两大特性[详细]
-
【数据结构】 两个栈实现一个队列【面试】
所属栏目:[安全] 日期:2020-12-15 热度:58
栈结构:先进后出,后进先出,只允许在栈尾操作。 队列:先进先出,在队尾入队,在队头出队。 要想用两个栈实现一个队列,就需要使用一个相当于中间量的结构进行队列的入队和出队操作。 用图形象化为: 650) this.width=650;" src="http://img.jb51.cc/vcimg[详细]