查找算法

JS高级

只谈情不闲聊 提交于 2020-03-01 15:35:11
1. 正则表达式: 2. String中的正则API: 1. 正则表达式: 2. String中的正则API: 查找: 1. 查找一个固定的关键词出现的位置: var i=str.indexOf("关键词"[,starti]) 在str中从starti位置开始找下一个"关键词"的位置 如果省略starti,则默认从0位置开始向后找 返回: “关键词”第一字所处位置的下标 如果找不到,返回-1 问题: 只支持查找一个固定不变的关键词 2. 用正则表达式查找一个关键词的位置: var i=str.search(/正则/i); 在str中查找符合"正则"要求的敏感词 返回值: 关键词的位置 如果找不到,返回-1 问题: 正则默认区分大小的! 解决: 在第2个/后加后缀i,表示ignore,意为:忽略大小写 问题: 只能获得关键词的位置,不能获得关键词的内容 解决: match 3. match: 1. 查找一个关键词的内容和位置: var arr=str.match(/正则/i); 在str中查找符合"正则"要求的敏感词的内容和位置 返回值: 数组arr:[ "0":"关键词", "index": 下标i ] 如果找不到: 返回null 问题: 只能查找第一个关键词,不能查找更多关键词 2. 查找所有关键词的内容: var arr=str.match(/正则/ig) //g global

二分查找算法(BinarySearch)

穿精又带淫゛_ 提交于 2020-03-01 12:26:25
实现:递归思路实现二分查找,找到返回下标,否则返回-1. 思路:思路是将查找值与数组最中间值比较,若查找值相等数字最中间值就找到了,返回下标值;若查找值小于最中间值,则把最左边到中间作为一个数组再进行查找;若查找值大于最中间值,则把中间到最右边作为一个数组再进行查找. 1 public class ArrayDemo{ 2   //参数a 代表查找的数组,参数left代表数组的最左边值的下标,参数right代表数组的最右边值的下标,参数n代表的是查找值 3   public static int binarySearch(int[] a,int left,int right,int n){ 4   //若左边值的下标大于最右边的下标,即代表查找完毕,没有找到该值,返回-1 5     if(left>right){ 6       return -1; 7     } 8     int mid = (left+right)/2; 9     if(a[mid] == n){ 10       return mid; 11     }else if(a[mid] > n){ 12       return binarySearch(a,left,mid-1,n); 13     }else{ 14       return binarySearch(a,mid+1,right,n)

面试题1:二维数组中查找

冷暖自知 提交于 2020-03-01 05:59:59
《剑指offer》Java版代码全集: https://github.com/wuping5719/Algorithm/tree/master/1-Sword-Offer 本题出自《剑指offer 名企面试官精讲典型编程题》面试题3。 题目3:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列按照从上到下递增的顺序排序。请完成一个函数,输入一个这样的二维数组和整数,判断数组中是否含有该整数。 例如下面的二维数组就是每行每列递增排序。如果在数组中查询7,则返回true;如果查找数字14,由于数组中不包含14,则返回false。 解决方法分析: 首先我们选取二维数组左下角的数字8,由于8大于7,并且8还是第四行的第一个数,因此数字7不可能出现在8所在的行,于是我们把这一行从需要考虑的区域中剔除,之后需要分析的只剩下3行。在剩下的矩阵中,位于左下角的数字是4,4小于7,可以把4所在的列从需要考虑的区域中剔除。接下来只需要分析剩下的3行3列即可。同理,可以照之前处理方式继续处理。 处理过程如下图所示: 注:矩阵灰色区域为下一步要查找的范围,绿色为所要查找的数字。 整个算法的逻辑: 首先选取数组左下角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的行;如果该数字小于要查找的数字,剔除这个数字所在的列。也就是说

算法:二维数组中的查找

拈花ヽ惹草 提交于 2020-03-01 05:55:02
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 C++11实现 #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; bool Find(vector<vector<int> > array,int target) { int rowCount = array.size(); int colCount = array[0].size(); int i,j; for(i=rowCount-1,j=0; i>=0&&j<colCount;) { if(target == array[i][j]) return true; if(target < array[i][j]) { i--; continue; } if(target > array[i][j]) { j++; continue; } } return false; } int main() { int k = 0; string sval; vector<int> sVec; vector<vector<int>> pVec;

二维“有序”数组查找问题的解决

南楼画角 提交于 2020-03-01 05:36:32
题目 :在一个二维数组中,每一行都按照从左到右递增的顺序排序,诶一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否包含了该整数。 例如下面的二维数组就是每行、没列都递增排序。如果在这个数组中查找数字7,则返回true(找得到);如果查找数字5,由于数组不含该数字,则返回false。 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 如下图所示,会出现 三种情况 。 数组中选取的数字(图中全黑的位置)刚好是要查找的数字( 相等 ),查找过程结束; 选取的数字 小于 要查找的数字,那么根据数组排序的规则,要查找的数字应该在当前位置的右边或者下边(如下图2.1(a)所示) 选取的数字 大于 要查找的数字,那么要查找的数字应该在当前选取的位置的上边或者左边。 分析: 由上图可知,当不等于要查找的数字的时候会出现两片要查找的区域重叠的情况。我们该怎么考虑呢? 我们可以 从数组的一个角上选取数字来和要查找的数字做比较 ,情况会变得简单一些。如:首先选取数组右上角的数字9。 由于9大于7 ,并且还是第4列的第一个(也是最小的)的数字,因此7不可能出现在数字9所在的列。于是我们 把这一 列 从需要考虑的区域内剔除 ,之后只需分析剩下的3列(如下图(a)所示)。在剩下的矩阵中,位于右上角的数字是8,同样 8大于7 ,因此

二分查找(Binary Search)

你。 提交于 2020-03-01 03:44:40
1、定义 二分查找又称 折半查找 ,它是一种效率较高的查找方法。 二分查找要求: 线性表是有序表 ,即表中 结点按关键字有序,并且要用向量作为表的存储结构 。不妨设有序表是递增有序的。 2、基本思想 二分查找的基本思想是: 设R[low..high]是当前的查找区间 (1)首先确定该区间的中点位置: (2)然后将待查的K值与R[mid].key比较:若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找,具体方法如下: ① 若 R[mid].key>K ,则由表的有序性可知R[mid..n].keys均大于K,因此若表中存在关键字等于K的结点,则该结点必定是在位置mid左边的子表R[1..mid-1]中,故新的查找区间是左子表R[1..mid-1]。 ② 若 R[mid].key<K ,则要查找的K必在mid的右子表R[mid+1..n]中,即新的查找区间是右子表R[mid+1..n]。下一次查找是针对新的查找区间进行的。 因此,从初始的查找区间R[1..n]开始,每经过一次与当前查找区间的中点位置上的结点关键字的比较,就可确定查找是否成功,不成功则当前的查找区间就缩小一半。这一过程重复直至找到关键字为K的结点,或者直至当前的查找区间为空(即查找失败)时为止。 3、存储结构 二分查找只适用顺序存储结构 。 4、二分查找算法 /*折半查找*/ int Binary

二叉排序树(Binary Sort Tree)

感情迁移 提交于 2020-03-01 01:23:33
1、定义 二叉排序树(Binary Sort Tree)又称 二叉查找(搜索)树 (Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ① 若它的左子树非空,则左子树上所有结点的值均小于根结点的值; ② 若它的右子树非空,则右子树上所有结点的值均大于根结点的值; ③ 左、右子树本身又各是一棵二叉排序树。 上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。 注意: 当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字有序,且不能用链表作存储结构,因此,当表的插入或删除操作频繁时,为维护表的有序性,势必要移动表中很多结点。这种由移动结点引起的额外时间开销,就会抵消二分查找的优点。也就是说,二分查找只适用于静态查找表。若要对动态查找表进行高效率的查找,可采用下二叉树或树作为表的组织形式。不妨将它们统称为树表。 2、特点 由BST性质可得: (1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。 (2) 二叉排序树中,各结点关键字是惟一的。 注意: 实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"大于等于",或将BST性质(2)里的"大于

海量数据处理:十道面试题与十个海量数据处理方法总结

谁说我不能喝 提交于 2020-02-29 16:44:19
1、海量日志数据,提取出某日访问百度次数最多的那个IP。 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。 或者如下阐述(雪域之鹰): 算法思想:分而治之+Hash 1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理; 2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址; 3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址; 4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP; 2、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个

从数据流中获取中位数

天大地大妈咪最大 提交于 2020-02-29 14:03:50
从数据流中获取中位数 需求描述 需求分析 C++代码如下 python代码 需求描述   有一个动态的数据流,如何比较快的获得数据流的中位数。这个过程中,数据流可能会有新的数据加入。中位数定义为元素个数为奇数的序列的排序结果中间位置元素值,偶数数列的排序结果中间位置的两个元素的元素值的平均。 需求分析   首先要获得数据流的中位数,这个问题可以轻易转换成 查找序列中的第k大的数 ,如果序列长度为偶数,则要查找两次,但是不会影响复杂度。但是现在还要处理的一个问题是,这个数据流的元素个数会增加的,元素一旦增加,很可能中位数就变了,如果再要获得就不会很方便。我们采用这个办法的话,就得重新查找中位数。   总结来看,我们查找一次中位数的时间复杂度是 O ( n ) O(n) O ( n ) ,分析在链接中的文章写得很清楚了。维护这样的数据流,每新来一个数据插入数据的时间复杂度就是 O ( 1 ) O(1) O ( 1 ) 了。因为要使用partition函数,所以这个数据流需要是顺序表的结构。   可能要多次查找中位数,我们维持一个排序的序列,要查找中位数只需要 O ( 1 ) O(1) O ( 1 ) 的时间复杂度。因为如果是顺序表的话,直接随机存储访问中间元素即可,如果是链表,我们需要设置两个指针,来指向中间元素,插入元素后这两个指针最多向后移动一个元素,不带来额外的复杂度

2.二维数组中的查找

耗尽温柔 提交于 2020-02-27 18:29:25
题目: 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 我的解法: 暴力的两次循环: class Solution { public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { for(int i = 0; i < matrix.size(); ++ i) { for(int j = 0; j < matrix[i].size(); ++ j) { if(matrix[i][j] == target) return true; } } return false; } }; 时间复杂度 为O(M*N) 非最优解。 空间复杂度为O(1) 解法摘录: 1. 本题解利用矩阵特点引入标志数,并通过标志数性质降低算法时间复杂度。 标志数引入: 此类矩阵中左下角和右上角元素有特殊性,称为标志数。 左下角元素: 为所在列最大元素