数据结构与算法
文章平均质量分 88
Lavi_qq_2910138025
这个作者很懒,什么都没留下…
展开
-
先升序后降序返回最大值
一个数列,先升序后降序,返回最大值的下标。package org.fan.learn;/** * Created by fan on 2016/10/10. */public class BinarySearchMeituan { public static int search(int[] arr) { //特殊处理 if (arr == n...转载 2019-09-16 23:08:36 · 1954 阅读 · 0 评论 -
海量数据处理面试题集锦
July博客:海量数据处理面试题集锦转载 2019-06-04 15:47:55 · 150 阅读 · 0 评论 -
教你如何迅速秒杀掉:99%的海量数据处理面试题
July博客:教你如何迅速秒杀掉:99%的海量数据处理面试题转载 2019-06-04 15:46:40 · 263 阅读 · 0 评论 -
海量数据处理专题(二)——Bloom Filter
1 什么是Bloom Filter布隆过滤器(Bloom Filter)是一个判断集合中是否包含特定元素的算法。比如,判断一个英文单词是否在字典中(单词拼写检查);黑名单检查等。也常用在搜索引擎中。布隆过滤器由一个很长的二进制向量和一系列随机映射函数组成。提供插入但不提供删除,但有用计数器代替bit位的变体提供删除操作。2 适用范围可以用来实现数据字典,进行数据的判重,或者集合求交集3 基...转载 2019-06-04 10:34:16 · 295 阅读 · 0 评论 -
海量数据处理专题(四)——Bit-map
0【什么是Bit-map】所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目...转载 2019-06-03 19:49:40 · 222 阅读 · 0 评论 -
海量数据处理专题(七)——数据库索引及优化
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。1 数据库索引1.1 什么是索引数据库索引好比是一本书前面的目录,能加快数据库的查询速度。例如这样一个查询:select * from table1 where id=44。如果没有索引,必须遍历整个表,直到ID等于44的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),直接在索引里...转载 2019-06-03 16:21:47 · 327 阅读 · 0 评论 -
葡萄酒贸易
Wine trading in GergoviaAs you may know from the comic “Asterix and the Chieftain’s Shield”,Gergovia consists of one street, and every inhabitant of the city is awine salesman. You wonder how this ec...转载 2019-04-15 20:45:38 · 788 阅读 · 0 评论 -
二分查找及其变种
1 二分查找二分查找是一个基础的算法,也是面试中常考的一个知识点。二分查找就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。/** * 二分查找,找到该值在数组中的下标,否则为-1 */static int binarySerach(int[] array, int key) { ...转载 2019-04-03 09:58:17 · 438 阅读 · 0 评论 -
C++stringstream的妙用
1 介绍C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。istringstream类用于执行C++风格的串流的输入操作。ostringstream类用于执行C风格的串流的输出操作。strstream类同时可以支持C风格的串流的输入输出操作。istringstream类是从istre...转载 2019-04-07 15:37:20 · 25017 阅读 · 3 评论 -
最低公共祖先(LCA)
1 前言最近公共祖先简称LCA(Lowest Common Ancestor),所谓LCA,是当给定一个有根树T时,对于任意两个结点u、v,找到一个离根最远的结点x,使得x同时是u和v的祖先,x 便是u、v的最近公共祖先。2 二叉搜索树/** * Definition for a binary tree node. * struct TreeNode { * int val;...转载 2019-04-07 14:45:30 · 1541 阅读 · 0 评论 -
LeetCode:230. 二叉搜索树中第K小的元素
题目描述:给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。思路:由于是二叉搜索树,所以是中序遍历的第K个节点。代码:解法一(来自剑指offer):/** * Definition for a binary tree node. * struct TreeNode {...转载 2019-04-06 20:48:03 · 192 阅读 · 0 评论 -
LeetCode:148. 排序链表
题目描述:在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5解题思想:归并排序法:在动手之前一直觉得空间复杂度为常量不太可能...转载 2019-04-06 16:53:32 · 363 阅读 · 0 评论 -
LeeCode:62. 不同路径
题目描述:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?说明:m 和 n 的值均不超过 100。示例 1:输入: m = 3, n = 2输出: 3解释:从左...原创 2019-03-24 17:17:58 · 222 阅读 · 0 评论 -
从头到尾彻底理解KMP
July博客:从头到尾彻底理解KMP转载 2019-06-04 15:49:26 · 209 阅读 · 0 评论 -
海量数据处理专题(二)——从Trie树(字典树)谈到后缀树(10.28修订)
July博客:从Trie树(字典树)谈到后缀树(10.28修订)转载 2019-06-04 15:51:13 · 265 阅读 · 0 评论 -
从B树、B+树、B*树谈到R 树
July博客:从B树、B+树、B*树谈到R 树转载 2019-06-04 15:55:56 · 248 阅读 · 1 评论 -
堆排序
五分钟弄懂有点难度的排序:堆排序转载 2019-09-13 15:19:22 · 154 阅读 · 0 评论 -
最小生成树的两种方法(Kruskal算法和Prim算法)
关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n...转载 2019-09-13 11:28:24 · 550 阅读 · 0 评论 -
如何不使用第三个变量来交换两个数的值
原文链接:如何不使用第三个变量来交换两个数的值转载 2019-09-09 08:18:05 · 195 阅读 · 0 评论 -
腾讯笔试-花匠小Q
两个参考的博客:使用排列组合腾讯2019技术岗笔试 花匠小Q动态规划codeforces 474D Flowers 动态规划codeforces 474D flowers 普通计数dp动态规划的没有看懂,以后再回头看看...原创 2019-09-06 12:16:32 · 367 阅读 · 0 评论 -
各种排序算法的时间复杂度、空间复杂度和稳定性分析
注:1 归并排序可以通过手摇算法将空间复杂度降到O(1),但是时间复杂度会提高。2 基数排序时间复杂度为O(N*M),其中N为数据个数,M为数据位数。辅助记忆时间复杂度记忆-冒泡、选择、直接 排序需要两个for循环,每次只关注一个元素,平均时间复杂度为O(n2)O(n2)(一遍找元素O(n)O(n),一遍找位置O(n)O(n))快速、归并、希尔、堆基于二分思想,log以2为底,平均...转载 2019-09-06 11:14:26 · 1142 阅读 · 0 评论 -
完美二叉树, 完全二叉树和完满二叉树
2 二叉树(Binary Tree)2.1 什么是二叉树(Binary Tree)每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。2.2 二叉树的性质(1)若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0)。(2)高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1)。 (空树的高度...转载 2019-09-05 22:23:51 · 761 阅读 · 0 评论 -
并查集
并查集:其实也就是满足两种结构的一种数据结构,这两个结构分别为:①isSameSet结构,这个结构是用来查找两个元素是否属于一个集合②还有一个是union结构,完成的就是把两个集合合并成一个大集合现在有点忙,稍后再整理,主要参考博客内容如下:并查集并查集详解(超级简单有趣~~就学会了)...转载 2019-08-30 15:08:13 · 177 阅读 · 0 评论 -
剑指offer——二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解法一:大家最容易想到的解法就是,不断右移并与1进行按位与运算。因为1除了最后一位是1,前面的位都是0,所以与1如果是1,则最后一位是1,否则最后一位是0。于是写出如下python代码:class Solution: def NumberOf1(self, n): # write code her...原创 2019-07-22 14:28:13 · 289 阅读 · 0 评论 -
python优先队列和堆的使用
0 前言优先队列和堆(大顶堆和小顶堆)经常被用来实现查找数组中最大或者最小的K个元素。之前一直使用C++对于C++的优先队列和堆比较熟悉,python的不太熟悉,这里进行记录。1 优先队列首先来看优先队列,优先队列中的元素是有优先级的,优先级高的元素排在前面。在python的中排序关键字小的排在前面。可以理解为排序关键字给出的是一个排名。 python3队列相关的模块在queue中,pyth...原创 2019-07-25 12:33:50 · 6880 阅读 · 0 评论 -
python中的queue模块
0 前言python中提供了内置的queue模块,需要注意的是这个模块不仅能够实现队列的基本特性:先进先出,还可以实现后进先出,既栈的功能。队列模块中的对象有三个基本的函数:put:向队列中添加元素get: 从队列中获取元素empty:用来判断队列是否为空1 先进先出FIFOqueue模块提供了Queue类来实现先进先出的功能。from queue import Queueq =...原创 2019-07-25 11:34:30 · 391 阅读 · 0 评论 -
二叉排序树(搜索树、查找树)
定义二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点:若其左子树存在,则其左子树中每个节点的值都不大于该节点值;若其右子树存在,则其右子树中每个节点的值都不小于该节点值。二叉搜索树的中序遍历序列是有序的。暂时先简单记录这一点,更深层的内容参考:数据结构(二):二叉搜索树(Binary Search Tree)十分钟带你了解二叉搜索树(BST)!...转载 2019-07-24 17:02:38 · 383 阅读 · 0 评论 -
二叉树的遍历:深度优先与广度优先
二叉树的遍历0 前言1 深度优先1.1 递归遍历1.2 迭代遍历1.2.1 前序遍历1.2.2 中序遍历1.2.3 后序遍历2 广度优先0 前言二叉树的遍历算法分为两种:深度优先和广度优先。深度优先搜索又有递归和迭代两种实现方式。1 深度优先二叉树的遍历递归算法很简单,是我们常用的遍历二叉树的算法,1.1 递归遍历二叉树的递归遍历算法,根据访问根的顺序分为三种,前序、中序和后序。前序的...原创 2019-07-28 23:26:00 · 440 阅读 · 0 评论 -
算法中的排列与组合
排列组合公式不含重复元素的排列组合含有重复元素的排列组合如果产生的组合和排列可以包含有重复的元素,其实这类问题在苏荷数学上是多种集的排列和组合问题。多重集的排列问题设S是有k种不同类型对象的多重集合,每个元素都有无限的重复数。那么s的r排列数目是krk^rkr.怎么理解上面的定义呢,举个例子,冰淇淋有3种口味可以选择,我可以选择3种相同口味,也可以选择不同口味,每次选择即可相同也可...原创 2019-03-24 15:05:45 · 2885 阅读 · 1 评论 -
八皇后问题
八皇后问题在8*8的国际象棋棋盘上,皇后是威力较大的棋子,它可以攻击到与自己同行、同列以及同一斜线上的棋子,如下图,所有橙色格子上的棋子,都可能会被皇后攻击:暴力方法该方法来自剑指offer。基本思想是,8*8的网格,8个皇后,則每行一个皇后,然后对0-7八个数字做全排列,表示8个皇后所在列的所有可能,这些可能包含皇后位于同一对角线的排列方式。所以要排除在同一对角线上的方案。...转载 2019-03-25 22:35:13 · 200 阅读 · 0 评论 -
LeetCode 33.搜索旋转排序数组
题目描述:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2]...原创 2019-03-20 09:53:15 · 188 阅读 · 0 评论 -
剑指offer:重建二叉树(C++)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。代码:#include <iostream>#include <stdlib.h>#include <string&...原创 2018-12-03 16:39:38 · 432 阅读 · 1 评论 -
算法导论习题练习——红黑树的插入和删除
题目13.3-2 将关键字 41、38、31、12、19、8 连续地插入一棵初始化为空的红黑树之后,试画出该结果树。 Solution: 13.4-3 在练习13.3-2中,我们将关键字41,38,31,12,19,8连续插入一棵初始为空的树中,从而得到一棵红黑树。请给出从该树中连续删除关键字8,12,19,31,38,41后的结果。 Solution: 首先,节点关键字为8的节点为红色原创 2017-12-17 21:51:59 · 10242 阅读 · 0 评论 -
凸多边形的最优三角划分最详细求解步骤演示[动态规划]
问题相关定义:(1)凸多边形的三角剖分:将凸多边形分割成互不相交的三角形的弦的集合T。 (2)最优剖分:给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分中诸三角形上权之和为最小。 凸多边形三角剖分如下图所示: 相关性质在凸多边形P的一个三角形部分T中,各弦互不相交,且弦数已达到最大,即P的任一不在T中的弦必与T中某一弦相交。在一个转载 2017-12-17 21:36:42 · 11575 阅读 · 12 评论 -
使用C++链表来实现二叉树的存储和基本操作
1、创建Node.h 定义链表的节点#ifndef NODE_H#define NODE_Hclass Node{public: Node(); Node* searchNode(int nodeIndex); void delNode(); void preOrderTraverse(); void midOrderTraverse();原创 2016-10-07 23:07:02 · 3886 阅读 · 0 评论 -
使用C++数组实现二叉树的存储和基本操作
1、创建文件ArrayTree.h 定义二叉树的数据结构#ifndef ARRAYTREE_H#define ARRAYTREE_Hclass ArrayTree{public: ArrayTree(int size,int *pRoot); ~ArrayTree(); int *searchNode(int nodeIndex); bool addNod原创 2016-10-07 22:57:39 · 3895 阅读 · 0 评论 -
使用C++邻接矩阵实现图的存储、Prim、Kruskal算法
1、创建Node.h 定义图的顶点#ifndef NODE_H#define NODE_Hclass Node{public: Node(char data=0); char m_cData; bool m_bIsVisited;};#endif // NODE_H2、创建Node.cpp 实现顶点的定义#include "Node.h"Node:原创 2016-10-08 21:37:11 · 2774 阅读 · 0 评论 -
数据结构基础——栈的C++实现
一、存储基本数据类型的栈的实现1、创建文件MyStatck.h#ifndef MYSTATCK_H#define MYSTATCK_Hclass MyStatck{public: MyStatck(int size); ~MyStatck(); bool statckEmpty()const; bool statckFull()const ;原创 2016-09-15 23:15:14 · 1443 阅读 · 0 评论 -
数据结构基础——循环队列的C++实现
一、定义存储基本数据类型的队列1、创建文件LoopQueue.h ,定义表示队列的类#ifndef LOOP_QUEUE_H#define LOOP_QUEUE_H/**环形队列的C++实现C++的类名并不比与类名相同**/class LoopQueue{public: LoopQueue(int queueCapacity);//initQueue(&Q)创建队列原创 2016-09-15 22:00:40 · 2813 阅读 · 2 评论 -
最大子序列和问题
问题描述: 输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:序列:-2 11 -4 13 -5 -2,则最大子序列和为20。序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。 算法一://穷举法,复杂度O(n^3) long maxSubSum1(const转载 2016-09-12 22:50:43 · 735 阅读 · 0 评论