数据结构与算法
文章平均质量分 69
legend050709ComeON
愚公移山
展开
-
linux数据圆整
(1)圆整圆整通常被理解为为满足某种要求而进行的数据修正。按照修正后的数据在数值上是否比原数据大,又可分为向上圆整和向下圆整。它们很像对模拟信号进行采样,对一定范围的数据向一个固定的数据靠拢。 (2)roundup(2.1)宏定义#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) 说明:其实向上圆整可以按照下面的宏定义,可能更加容易理解;...原创 2018-06-26 20:24:35 · 1392 阅读 · 0 评论 -
生成m个0到n范围内的不同的随机数
(1)背景在0~n的范围内,生成m个不同的随机数,每个数出现的概率相同;或者生成m个0~(m-1)范围内的不同的随机数; (2)方法一(2.1)原理最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机数比较,如果重复,就重新产生。(2.2)伪代码实现void get_rand(int *a, int m, int n, int k)//结果存在a中{ int i,j,t; ...原创 2018-06-25 21:55:24 · 1568 阅读 · 0 评论 -
山峰数组问题
问题符合下列属性的数组 arr 称为 山脉数组 :arr.length >= 3 存在 i(0 < i< arr.length - 1) 使得: arr[0] < arr[1] < ... arr[i-1] < arr[i] arr[i] > arr[i+1] > ... > arr[arr.length - 1] 给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i .转载 2021-06-15 20:48:12 · 573 阅读 · 0 评论 -
位运算&异或运算扩展----legend050709
(1)整型数组里除了一个数字之外,其它的数字都出现了两次,找出这个只出现一次的数字;(2)整型数组除了2个数字只出现一次外,其他数字成对出现,找出落单的2个数;(3)数组中每个数会出现3次,只有1个例外的数仅出现1次,找出该数字;-------------(1)整型数组里除了一个数字之外,其它的数字都出现了两次,找出这个只出现一次的数字要求时间复杂度是O(n),空间复杂度是O(...原创 2020-01-09 22:27:21 · 268 阅读 · 0 评论 -
区间最值查询RMQ问题----legend050709
(1)定义RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。(2)问题给一个长度为n的数列a1~an和一个整数k。求数列bi=min(ai,ai+1,…,ai+k-1)。(3)分析我们可以很容...原创 2020-01-08 10:43:57 · 133 阅读 · 0 评论 -
高效的hash表实现----legend050709
(1)背景(2)hash函数的好坏评价标准(3)装载因子(元素个数)过大怎么办?(4)解决hash冲突的方法(4.1)拉链法(4.2)开放地址法(5)工业级散列表范例-------(1)背景散列表的查询效率并不能笼统地说成是 O(1)。它跟散列函数、装载因子(元素个数)、散列冲突等都有关系。如果散列函数设计得不好,或者装载因子过高,都可能导致散列冲突发生的概率升...原创 2020-01-04 19:11:36 · 322 阅读 · 0 评论 -
最小圆覆盖问题-----legend050709
最小圆覆盖问题(1)背景(2)定义(3)原创 2020-01-04 18:02:23 · 149 阅读 · 0 评论 -
如何在面试时写出来高质量的代码
可以从代码的规范性、完整性、健壮性、扩展性等几个方面提高代码的质量。(1)代码的规范性书写清晰、布局清晰、命名合理;书写清晰:可以写慢一点,但是字迹清晰;布局清晰:缩进,以及代码的风格统一;命名合理:变量命令,函数命名,尽量用容易理解的命名;不用魔数等;(2)代码的完整性是否完成了基本功能、输入边界值是否能得到正确的输出、是否对各种不合规范的非法输入做出了合理的错误处理:从功...原创 2020-01-04 17:03:19 · 442 阅读 · 0 评论 -
生产者消费者之双缓冲区--legend050709
(1)背景(1.1)减少锁的冲突在生产者-消费者模式中,我们常常会使用到队列,这个队列在多个线程共享访问时存在互斥和竞争操作, 意味着每次访问都要加锁。用一个缓冲区,生产者和消费者需要先获取到缓冲区的锁才能进行put和get操作,每一次put和get都需要获取一次锁,这需要大量的同步与互斥操作,十分损耗性能。如果采用双缓冲区的话,一个缓冲区bufferA用于生产者执行put操作,一个缓...原创 2019-12-24 20:00:54 · 1502 阅读 · 1 评论 -
linux多线程协作--legend050709
(1)三个线程协作打印ABCABCABC(2)两个线程协作打印奇数偶数--------------------------------(1)三个线程协作打印ABCABCABC(1.1)思路并发编程核心是三大块:分工、互斥和同步。1)互斥这道题并不涉及共享变量,所以不需要考虑互斥,首先排除。2)同步一眼就能看出这道题考的就是同步,那怎么同步呢?很容易想到的方法,就...原创 2019-12-23 22:54:25 · 132 阅读 · 0 评论 -
hashMap & linkedHashMap & concurrentHashMap 原理----legend050709
(1)hashMap(2)linkedHashMap----------------(1)hashMap(1.1)hashHash 就是把任意长度的输入(又叫做预映射, pre-image),通过哈希算法,变换成固定长度的输出(通常是整型),该输出就是哈希值。这种转换是一种 压缩映射 ,也就是说,散列值的空间通常远小于输入的空间。不同的输入可能会散列成相同的输出,从而不可能...原创 2019-12-21 15:45:08 · 326 阅读 · 0 评论 -
链表的分类--legend050709
链表的分类如下(1) 单向链表(2)单向循环链表(3)双向链表(4)双向循环链表------(1) 单向链表(1.1)特点每个节点只包含一个指针,即后继指针。 单链表有两个特殊的节点,即首节点和尾节点。用首节点地址表示整条链表,尾节点的后继指针指向空地址null。 性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。(2)单向循环链...原创 2019-12-20 14:09:01 · 993 阅读 · 0 评论 -
缓存淘汰机制实现-LRU-LFU——legend050709
(1)缓存是什么缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非广泛的应用,比如常见的CPU缓存、数据库缓存、浏览器缓存等等。(2)为什么需要缓存CPU在从内存读取数据的时候,会先把读取到的数据加载到CPU的缓存中。而CPU每次从内存读取数据并不是只读取那个特定要访问的地址,而是读取一个数据块(cacheline)并保存到CPU缓存中,然后下次访问内存数据的时候就会先从...原创 2019-12-19 18:07:01 · 326 阅读 · 0 评论 -
快速排序总结_legend
快速排序(一) 简介 : 快速排序是由Hoare提出的,采用了分治法(Divide-and-ConquerMethod)。分治法一般分成三个组成部分:分解,解决,合并。快速排序不需要合并,只有分解 ,以及解决(递归)两个步骤。(二) 基本思想 :(挖坑填数+分治法) 1.先从数列中取出一个数作为基准数。 2.将比这个数大的数全放到它的右边,小于或等原创 2014-05-16 16:16:30 · 642 阅读 · 0 评论 -
二路归并排序mergeSort代码实现_legend
#include using namespace std;#include#include#include#includetypedef int elementType;/*将两个有序的数组[start,mid],[mid+1,end]2路合并注意:此中由于是[start,mid],[mid+1,end]所以while循环中均需要加上等号。*/原创 2014-05-20 17:46:13 · 964 阅读 · 0 评论 -
栈的应用之表达式求值code_legend
/*表达式求值*/#include "stdio.h"#include "math.h"#include "stdlib.h"#include "process.h"#define STACKINITSIZE 100#define STACKINCREMENT 10typedef struct{double *base;double *top;int转载 2014-06-03 13:44:21 · 757 阅读 · 0 评论 -
查找 Kth 小的数
查找第k小数:(1)境界一:全部排序 :O(n*lgn+k)先快速排序O(n*lgn),然后在找出最小的k个数。O(k)(2)境界二:部分排序 。O(kn)根据选择排序,每次可以取得最小的数放在开头。/*输入:数组array,及其长度length,k;输出: 第k小的元素 :*/int selectTheKthSmallest(int原创 2014-06-03 17:47:17 · 883 阅读 · 0 评论 -
顺序表的基本操作_legend
/*值得学习的地方,是其中的每一个元素定义为elementType ,以及输出格式FORMATSTR " %d "便于移植。*//*详细请看ppt :线性表基本操作(注:初始化len=0.添加一个元素则先填充元素到len位置,然后len++;所以填元素的范围为0~len-1)*/#include using namespace s原创 2014-05-22 12:02:06 · 2017 阅读 · 0 评论 -
二分查找。BinarySearch
二分查找。BinarySearch转自:http://www.cppblog.com/converse/archive/2009/10/05/97905.html二分查找算法基本思想二分查找算法的前置条件是,一个已经排序好的序列(在本篇文章中为了说明问题的方便,假设这个序列是升序排列的),这样在查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的转载 2014-03-01 22:40:31 · 732 阅读 · 0 评论 -
单链表的基本操作_legend
#include using namespace std;#include#include#include/*详细见ppt:线性表基本操作1.可以学习的地方,函数中按值传递,以及引用传递。如:此中initLinkList 以及destroy函数中,传递的都是LINKLIST *,但是在insertNodeAt,deleteNodeAt,searc原创 2014-05-22 12:04:58 · 798 阅读 · 0 评论 -
插入排序
插入排序:insertSort1.ieda: 比如从小到大排序,编号为i的元素A[i],认为其前面的元素已经有序(即0~i-1的元素已经是从小到大有序), 然后A[i]与其前面的元素(i-1~0)逐个比较。比A[i]大的元素后移,将A[i]放在合适的位置。 complexity: n^22.input: 数组A,size n;3.output原创 2014-03-01 22:44:32 · 780 阅读 · 0 评论 -
selectSort
selectSort:1. idea:比如说从小到大排序,第一个元素与ta后面的元素逐个比较,如果发现比该元素小的元素则swap,这样一轮比较下来最小的元素放在了第一个位置;然后第二个元素与后面的元素进行比较,把第二小的元素放在了第二个位置,。。。。。。comflexity: n^2;2. input:数组A,size n;3. output:排好序的数组A;4. proces...原创 2014-02-26 13:59:18 · 800 阅读 · 0 评论 -
单链表应用之多项式的操作_legend
#include using namespace std;#include#include#include/*(1)需要思考的地方,还是那个函数的按值传递,以及引用传递,此中的initLinkList,以及destroyLinkList函数中的参数时LINKLIST*,是由于传递之后希望值发生改变,所以引用传递。然后那个createLinkList函数中原创 2014-05-22 12:10:21 · 1119 阅读 · 0 评论 -
归并排序详解_legend
2路归并排序 mergeSort(1)基础知识:mergeSort也是应用分治(deviede and conquer)算法的.分治(devide and conquer)分为三个步骤:划分(partition),解决(solution),合并(merge).2路归并:把两个有序的 序列合并成一个新的有序的序列,称为2路归并。(2)思想:将待排序 的数组分成原创 2014-05-20 17:50:35 · 602 阅读 · 0 评论 -
数组中出现次数最多的元素_legend
数组中出现次数 最多的 元素 :(方法一) :/*先快速排序,复杂度为O(n*lgn),然后从有序数组中找到重复次数最多的元素,复杂度为O(n);所以整体复杂度为 O(n*lgn+n);*/ quickSort(arr,0,length); void mostRepeatedElement(int * arr,int length,int* mostRepe原创 2014-05-22 13:43:48 · 3298 阅读 · 0 评论 -
栈的应用之迷宫问题
/************************************************************************//*自定义栈 *//*通过自定义的简单栈以满足迷宫求解 *//*功原创 2014-06-05 20:23:03 · 704 阅读 · 0 评论 -
中缀转为后缀并求值_legend
中缀表达式->后缀表达式,并求值:(1)中缀表达式->后缀表达式的方法:(1.0)定义一个符号栈:存储+,-,*,/,(,)等符号。(1.1)遇到操作数:直接添加到后缀表达式中;(1.2)栈为空时遇到运算符:直接入栈;(1.3)遇到左括号:将其入栈;(1.4)遇到右括号:执行出栈操作,并将出栈元素加入到后缀中,直到出栈的是左括号,左括号不加入到后缀中。(1.转载 2014-06-05 14:32:29 · 673 阅读 · 0 评论 -
栈的总结_legend
栈stack:(1)栈的基本知识: (1.1)栈的存储结构: (1.2)栈的特点:(2)栈的基本操作: (2.1)顺序栈的基本操作: (2.2)链式栈的基本操作:(3)顺序栈:seqStack(4)链式栈:linkStack(5)共享原创 2014-06-08 20:27:51 · 985 阅读 · 0 评论 -
迷宫C实现
#include #include #define MAXSIZE 20 #define ERROR -1 #define OK 1 #define FALSE 0 #define TRUE 1 typedef enum{RIGHT,DOWN,LEFT,UP}Direction;转载 2014-06-08 20:53:35 · 771 阅读 · 0 评论 -
O(1)求栈中最小值
扩展栈O(1)求取最小值:(0)问题描述:(1)分析:(2)步骤:(3)代码实现:------------------------(0)问题描述:扩展stack的实现,完成正常的push,pop操作,新增访问最小(或最大)元素的接口Min(),使得push,pop,Min的时间复杂度都是O(1)。(1)方法一:(1.1)分析:在栈的每个元素加一个属性...原创 2014-06-08 20:09:23 · 1194 阅读 · 0 评论 -
gcd详解(Eculid && exEuclid && Stein)
gcd详解:(1)欧几里德算法 /辗转相除法: (计算两个数的最大公约数) (1.1)定理 : gcd(a,b) = gcd(b,a mod b)(1.2)证明 : a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数。原创 2014-05-25 16:48:36 · 1413 阅读 · 0 评论 -
gcd && 素数_legend
数据处理:(1)gcd (Greatest Common Divisor):(2)素数 (质数)(prime number): (2.1)判断素数 : (2.1.1)试除法 : (2.1.2)筛选法 : (2.2)前N个素数 : (2.3)小于等于N的素数 :------------------------------------------------原创 2014-05-25 13:05:07 · 908 阅读 · 0 评论 -
数据结构基础概括_legend
数据结构基础知识: 数据结构基础: (1)数据结构: (1.1)逻辑结构 : (1.1.1)线性结构 : (数据元素之间一对一的前驱与后继关系) (1.1.2)非线性结构 : (1.1.2.1)树形结构 : (1.1.2.2)图形结构 : (1.2)存储结构 : (1.2.1)顺序存储结构: (1.2.原创 2014-05-25 13:00:56 · 580 阅读 · 0 评论 -
循环队列的基本操作之代码实现_legend
#include using namespace std;#define MaxSize 20typedef int qElemType;class SeQueueType{ public: qElemType data[MaxSize]; int front; int rear; public:原创 2014-06-10 15:18:06 · 1249 阅读 · 0 评论 -
前n个素数 && 小于等于n的素数_legend
#include #include#includeusing namespace std;/*取得前n个素数*/void get_primes(int *primeArray,int n){ primeArray[0]=2; primeArray[1]=3; int count=1; int i; i原创 2014-05-25 14:35:25 · 894 阅读 · 0 评论 -
链式队列基本操作之code_legend
#include using namespace std;typedef int ElemType;class QNode{ public: ElemType data;/*数据域*/ QNode * next; public : /*构造函数初始化各个数据成员*/ QNode(ElemType原创 2014-06-10 20:57:38 · 729 阅读 · 0 评论 -
滑动窗口(单调队列)讲解_legend
双端队列的应用:(一):长度为k的滑动窗口取最小值:(或者称为单调队列)(二):多重背包问题:--------(一)长度为k的滑动窗口取最小值:(1)问题背景:slider window有一个长度为n的数组,有一个长度为k的滑动窗口,从左往右每次滑动一个元素;求出每次滑动窗口中的最小的元素。如:n=5;k=3;a={1,3,5,4,2}则输出b={1,3,2};1是原创 2014-07-02 14:20:50 · 2195 阅读 · 0 评论 -
滑动窗口/单调队列之代码实现_legend
/*问题:有一个长度为n的数组,和一个长度为k的滑动窗口,滑动窗口从数组的左边往右边滑动,每次滑动一个距离,输出滑动窗口内的最大值,最小值。(或者为建立一个单调队列)单调队列思想:(1)元素从尾部进,尾部出,头部只出,不进。(2)单调递增队列:进队则如果队列为空或者队尾元素比当前待进元素小,元素直接进队;若队尾元素比待进元素大,则队尾元素从队尾出队,直至队列为空原创 2014-07-02 14:17:36 · 2462 阅读 · 0 评论 -
队列应用之打印杨辉三角_legend
(1)图解:(2)代码实现:#include using namespace std;/*打印杨辉三角;杨辉三角如: 1 1 1 1 2 11 3 3 1第n行有n个数,两边是1.然后中间的某个数,等于上一行的两个相邻数之和。*/#define MaxSize 30typedef int q原创 2014-06-14 16:47:40 · 6146 阅读 · 0 评论 -
双端队列_legend
双端队列:double-end-Queue(deque)(循环队列实现双端队列,具有栈和队列的性质。)(一)双端队列:(1.1)双端队列图解:双端队列(Deque:double ended queue)就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。相对于普通队列,双端队列的入队和出队操作在两端都可进行。(1.2)双端队列解析:双端队列...原创 2014-06-14 20:02:01 · 14001 阅读 · 3 评论