查找算法

查找两个有序数组的中位数,时间复杂度为 O(log(m + n))

江枫思渺然 提交于 2020-01-15 17:20:03
题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 首先明确几个点: 1、两个数组都是有序的 如 [1,3,5] [2,4,6] 合并后中位数为3、4,分别分布在数组1和数组2中,那么以3、4为分隔点,在数量上:数组1的左边元素个数 + 数组2的左边 = 数组1的右边 + 数组2右边元素个数 再如: [1,3,5] [0,2,4,6] 合并后中位数为3,只在数组1中,那我们将3放入数组2中,[0,2,3,4,6] 刚才的推论依然成立 中位数左边元素的数量等于中位数右边元素的数量 2、 数组1中,中位数左边最大的元素一定小于中位数右边最小的元素,当数组2中也有中位数

在排序数组中查找元素的第一个和最后一个位置

≯℡__Kan透↙ 提交于 2020-01-15 08:57:21
题目 给定一个按照升序排列的整数数组 nums ,和一个目标值 target 。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1] 。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1] 代码与思路 # include <stdio.h> # include <vector> //查找左端点 int left_bound ( std :: vector < int > & nums , int target ) { int begin = 0 ; int end = nums . size ( ) - 1 ; while ( begin <= end ) { int mid = ( begin + end ) / 2 ; if ( target == nums [ mid ] ) { if ( mid == 0 || nums [ mid - 1 ] < target ) { return mid ; } end = mid - 1 ; } else if ( target < nums [ mid ] ) { end =

查找及其应用

。_饼干妹妹 提交于 2020-01-14 06:35:54
数据结构(实验C语言版) 查找及其应用 一、实验目的 (1)掌握在数组上进行各种查找的方法和算法 (2)深刻理解各种方法的特点,并能灵活运用 (3)加深对查找的理解,逐步培养解决实际问题的编程能力 二、实验环境 硬件环境要求: PC机(单机) 使用的软件名称、版本号以及模块: VS2010或Visual C++ 6.0或Win-TC等。 三、实验内容 设计一个程序实现二叉排序树的基本运算,并在此基础上完成如下功能: (1) 由{4,9,0,1,8,6,3,5,2,7}创建一颗二叉排序bt并以括号表示输出。 (2) 判断bt是否为一颗二叉排序树。 (3) 查找关键字为6的结点,并输出其查找路径。 (4) 分别删除bt中关键字为4和5的节点,并输出删除后的二叉排序树。 四、实验要求 1、用 VS2010 工具创建文件或程序,输入代码后,进行编译运行或在控制台 执行。 2、观看程序运行结果,并根据结果进行思考,对程序进行修改和总结。 源代码 #include < stdio . h > #include < malloc . h > #define MaxSize 100 typedef int KeyType ; //定义关键字类型 typedef char InfoType ; typedef struct node //记录类型 { KeyType key ; //关键字项

一招教你巧用递归解决矩阵最大序列和问题

血红的双手。 提交于 2020-01-13 23:46:28
之前同事问了一道需要点脑洞的算法题,我觉得蛮有意思的,思路可能会给大家带来一些启发,在此记录一下 题目 现有一个元素仅为 0,1 的 n 阶矩阵,求连续相邻(水平或垂直,不能有环)值为 1 的元素组成的序列和的最大值。假设有如下矩阵 则此矩阵连续相邻值为 1 的元素组成的序列和分别为 4, 3,(如图示),可知这个矩阵符合条件的序列和的最大值为 4 解题思路 要算序列和的最大值,我们可以先找出所有可能的序列,自然就找到了序列和的最大值,那怎么找这些序列呢?首先我们发现,每个序列的起点和终点必然是 1,我们可以遍历矩阵的每一个元素,如果元素值为 1,则将其作为序列的起点开始查找所有以这个元素为起点的序列,我们知道序列是可以向垂直和水平方向延伸的,所以我们可以以这个元素为起点,查找它的上下左右值为 1 的元素,再以找到的这些元素为起点,继续在元素的上下左右查找值为 1 的元素,以此类推(递归),如果找不到符合条件的值,则序列终止,在遍历过程中保存每条序列遍历的元素,即可求得每条符合条件的序列,从而求得序列和的最大值 文字说得有点绕,接下来我们就以查找如下矩阵的最大序列和为例来详细看一下如何查找最大序列和 1. 从左到右,从上到下遍历所有值为 1 的元素,第一个符合条件的元素在右上角,所以以这个元素为起点来查找序列 2. 以这个元素为起点,查找这个元素上下左右为值为 1 的元素

Rasa教程系列-NLU-1-训练集格式

拥有回忆 提交于 2020-01-13 23:24:40
文章目录 1. 数据格式 1.1 Markdown格式 1.2 Json 格式 2. 改善意图分类和实体识别 2.1 常见示例(Common Examples) 2.2 正则特征(Regular Expression Features) 2.3 查找表(lookup tables) 3. 标准化数据 3.1 实体同义词 4. 生成更多实体例子 1. 数据格式 NLU模块的训练可以使用 Markdown 或 JSON格式的数据。可以是单个文件也可以是某个目录下的多个文件。推荐使用Markdown格式~用起来简单。 1.1 Markdown格式 作为Rasa NLU的一种格式,Markdown最易于阅读和书写。NLU中的examples以无序列表语法的形式给出,如 -,*,+ 。examples 通过 intent 进行组合,实体和实体的名字通过 markdown 的链接形式给出,如[entity](entity name)。下面给出一个NLU数据集的Markdown实例: - what is my balance <!-- no entity --> - how much do I have on my [savings](source_account) <!-- entity "source_account" has value "savings" --> - how much

元素查找(数据结构与算法)(python)

别等时光非礼了梦想. 提交于 2020-01-13 07:19:04
创建列表aList中的元素,移除每个元素的空格,增加一个元素’python’, 并找出以’A’或者’a’开头,并以’c’结尾的所有元素,并添加到一个新列表中,最后循环打印这个新列表,用两种方法删除一个元素,转化为元组。 aList = ['taibai ','alexC','AbC ','egon',' Ritian',' Wusir',' aqc'] alist = ['taibai','alexC','AbC','egon','Ritian','Wusir',' aqc'] alist.append('python') print(alist) list1=[] list2=[] for i in alist: new_li = i.strip() list2.append(new_li) if (new_li.startswith('a') or new_li.startswith('A')) and new_li.endswith('c'): print(new_li) list1.append(new_li) print(list1) print(3*list1) del list2[2] print(list2) list2.pop(1) print(list2) alist_tuple=tuple(list2) print(alist_tuple) 来源: CSDN

从B树、B+树、B*树谈到R 树

。_饼干妹妹 提交于 2020-01-13 05:09:46
http://blog.csdn.net/v_july_v/article/details/6530142 第一节、B树、B+树、B*树(原文部分摘录) 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ),B-tree/B + -tree/ B * -tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度 O (log 2 N )与树的深度相关,那么降低树的深度自然会提高查找效率。 但是咱们有面对这样一个实际问题:就是大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于 树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下 (为什么会出现这种情况,待会在外部存储器-磁盘中有所解释),那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用 多叉树 结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。 也就是说,因为磁盘的操作费时费资源,如果过于频繁的多次查找势必效率低下。那么如何提高效率,即如何避免磁盘过于频繁的多次查找呢

B-树和B+树和B*树和R树

妖精的绣舞 提交于 2020-01-12 16:49:28
  在大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于 树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下 ,那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用 多叉树 结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。   为了更有效的 减少树的深度 ,新的查找树结构——多路查找树。根据平衡二叉树的启发,自然就想到平衡多路查找树结构。即B树结构。    磁盘读取数据是以盘块 (block) 为基本单位的。 位于同一盘块中的所有数据都能被一次性全部读取出来。而磁盘IO代价主要花费在查找时间Ts上。因此我们应该尽量将相关信息存放在同一盘块,同一磁道中。或者至少放在同一柱面或相邻柱面上,以求在读/ 写信息时尽量 减少磁头来回移动的次数 ,避免过多的查找时间 Ts 。   所以,在大规模数据存储方面,大量数据存储在外存磁盘中,而在外存磁盘中读取/写入块(block)中某数据时,首先需要 定位到磁盘中的某块 。 1.B-树(B树)   1)定义   B是 balanced,而不是b inary,B-树或B_树 不要误解成“B减树”,“-”“_”只是连字符。   是一种多路搜索树(并不是二叉的),一个M阶的B树: 1

HBase表的设计(一)

岁酱吖の 提交于 2020-01-11 16:48:06
HBase表模式的设计  对于HBase表,在设计表结构之前,我们需要先考虑的几个问题: 这个表应该有多少个列族? 列族使用的是什么数据? 每个列族应该有多少列? 列名应该是什么?尽管列名不必在建表的时候定义,但是后期读写数据时是需要知道的。 单元存放什么数据? 每个单元存储多少个时间版本? 行健结构是什么?应该包含什么信息? 模式影响到表结构和如何读写表,所以说把这些放到宽泛的模式设计中变得尤为重要。 一、HBase的存储方式    HBase底层物理存储是基于HDFS,在HDFS上是以HFile的形式进行存储的: 表中的列族在HDFS上是以HFile的形式存在,一个HFile对应一个列族,但是一个列族可能会对应多个HFile。    一个特定的列族的所有数据在HDFS上会有一个物理存储,这个物理存储区可能会有多个HFile组成,理论上可以通过合并来得到一个HFile,一个列族的所有列在硬盘上是存放在一起的,使用这个特性,可以把不同模式的列放在不同的列族,以便隔离他们。这也是HBase面相列族存储的原因。 二、宽表与高表 宽表:   HBase中所谓的宽表,指的是表中行少而列多,也就是说一行当中包含有很多的列,但是表整体行很少,比如一张表中行健一共有100个,但是每个行健所包含的列有1000个,这种就是所谓的宽表。 高表       HBase中所谓的高表,恰好与宽表相反,行多

深刻理解二叉树、红黑树、B-tree、B+tree

人走茶凉 提交于 2020-01-11 05:36:12
一 理解索引的特性 索引是帮助MySQL高效获取数据的排好序的数据结构 索引存储在文件里 二 索引的各种存储结构及其优缺点 在开始讲这一小节之前,我们先来看一下在数据库没有加索引的情况下,SQL中的where字句是如何查找目标记录的。 我们先看下左边表格第二列Col2列的数据时如何查找的,如果我们希望查找where Col2 = 22的记录,我们在没加索引的情况下是按顺序从第一条记录查找,由此可知需要查找5次才能找到; 如果对Col2字段加上索引后,我们假设使用最简单的二叉树作为索引存储方式,再次查找where Col2 = 22的记录这次只需要查找2次就能找到目标记录,效率提高十分明显。 (一) 二叉树 1. 优点: 二叉树是一种比顺序结构更加高效地查找目标元素的结构,它可以从第一个父节点开始跟目标元素值比较,如果相等则返回当前节点,如果目标元素值小于当前节点,则移动到左侧子节点进行比较,大于的情况则移动到右侧子节点进行比较,反复进行操作最终移动到目标元素节点位置。 2. 缺点: 在大部分情况下,我们设计索引时都会在表中提供一个自增整形字段作为建立索引的列,在这种场景下使用二叉树的结构会导致我们的索引总是添加到右侧,在查找记录时跟没加索引的情况是一样的,如下图所示: (二) 红黑树 1. 优点: 红黑树也叫平衡二叉树,它不仅继承了二叉树的优点