查找算法

JavaScript基础

时间秒杀一切 提交于 2020-03-15 09:14:48
JavaScript基础 第1天 数据类型 简单数据类型 Number,String,Boolean,Undefined,Null 复杂数据类型 Object 第4天 数组 第5天 对象 什么是对象? 在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。 对象是由属性和方法组成的。 属性:事物的特征,在对象中用属性来表示(常用名词) 方法:事物的行为,在对象中用方法来表示(常用动词) 对象中的键和值 键:相当于属性名 值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等) 遍历对象 for (变量 in 对象名字) { // 在此执行代码 } for (var k in obj) { console.log(k); // 这里的 k 是属性名 console.log(obj[k]); // 这里的 obj[k] 是属性值 } 第6天 JavaScript内置对象:Math、Date、Array、String等 数组对象 字符串对象 字符串通过基本包装类型可以调用部分方法来操作字符串 以下是返回指定字符的位置的方法: indexOf(要查找的字符,开始的位置) 返回指定内容在元字符串中的位置,如果找不到就返回-1, 开始的位置是index索引号 案例:查找字符串

面试基础:KMP字符串查找算法

故事扮演 提交于 2020-03-13 16:38:33
字符串的一种基本操作是子字符串查找:给定一端长度为N的文本字符串text和一个长度为M(M<N)的模式字符串pattern,在文本字符串中查找和该模式字符串相同的子字符串。 在这互联网时代,字符串查找的需求在很多情景都需要,如在文本编辑器或浏览器查找某个单词、在通信内容中截取感兴趣的模式文本等等。 子字符串查找最简单的实现肯定是暴力查找: public static int search(String text, String pattern) { int N = text.length(); int M = pattern.length(); for (int i = 0; i < N-M; i++) { int j; for (j = 0; j < M; j++) { if (text.charAt(i+j) != pattern.charAt(j)) break; } if (j == M) return i; } return -1; } 可以看到,暴力查找的最坏时间复杂度为O(N*M),实际应用中往往文本字符串很长(成万上亿个字符),而模式字符串很短,这样暴力算法的时间复杂度是无法接受的。 为了改进查找时间,人们发明了很多字符串查找算法,而今天的主角KMP算法(D.E.Knuth,J.H.Morris和V.R.Pratt发明,简称KMP算法)就是其中的一种。

K近邻法

南笙酒味 提交于 2020-03-13 13:06:49
概述 k近邻法(k-nearest neighbor, k-NN) 是一种基本分类与回归方法(此处讨论的是分类问题的K近邻算法)。 k近邻法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”,不具有显式的学习过程。 k近邻算法的特殊情况是k=1的时候,此时称为最近邻算法。 k 值的选择、距离度量及分类决策规则 是k近邻法的三个基本要素。 K近邻算法 k近邻模型 1、模型 在k近邻算法中,当训练集、最近邻值k、距离度量、决策规则等确定下来时,整个算法实际上是 利用训练集把特征空间划分成一个个子空间 ,训练集中的每个样本占据一部分空间。 具体地,在特征空间中,对每个训练样本而言,距离该点比其他点更近的所有点组成一个区域,叫做单元。每个训练样本拥有一个单元,所有样本的单元构成对特征空间的一个划分。然后该单元的所有点的标签都和该单元的样本点一致。 以最近邻为例,当测试样本落在某个训练样本的领域内,就把测试样本标记为这一类。 2、距离度量 特征空间中两个实例点的距离是两个实例点相似程度的反映。 常用的是欧氏距离,也可以是其他距离。 值得注意的是,使用不同的距离度量,计算出的最近邻点是不同的。 更多距离度量详见该博客:https://blog.csdn.net/h_wlyfw/article/details/24023325 3、k值的选择 如果选择较小的k值 ,“学习”的

BM字符串查找算法

混江龙づ霸主 提交于 2020-03-12 16:42:18
字符串的一种基本操作是子字符串查找:给定一端长度为N的文本字符串text和一个长度为M(M<N)的模式字符串pattern,在文本字符串中查找和该模式字符串相同的子字符串。在这互联网时代,字符串查找的需求在很多情景都需要,如在文本编辑器或浏览器查找某个单词、在通信内容中截取感兴趣的模式文本等等。 子字符串查找最简单的实现肯定是暴力查找: public static int search(String text, String pattern) { int N = text.length(); int M = pattern.length(); for (int i = 0; i < N-M; i++) { int j; for (j = 0; j < M; j++) { if (text.charAt(i+j) != pattern.charAt(j)) break; } if (j == M) return i; } return -1; } 可以看到,暴力查找的最坏时间复杂度为O(N*M),实际应用中往往文本字符串很长(成万上亿个字符),而模式字符串很短,这样暴力算法的时间复杂度是无法接受的。 为了改进查找时间,人们发明了很多字符串查找算法,而今天的主角BM算法(Bob Boyer和J Strother Moore发明,简称BM算法)就是其中的一种。

Redis(6)——GeoHash查找附近的人

人盡茶涼 提交于 2020-03-12 08:34:55
像微信 "附近的人" ,美团 "附近的餐厅" ,支付宝共享单车 "附近的车" 是怎么设计实现的呢? 一、使用数据库实现查找附近的人 我们都知道,地球上的任何一个位置都可以使用二维的 经纬度 来表示,经度范围 [-180, 180] ,纬度范围 [-90, 90] ,纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。比如说,北京人民英雄纪念碑的经纬度坐标就是 (39.904610, 116.397724) ,都是正数,因为中国位于东北半球。 所以,当我们使用数据库存储了所有人的 经纬度 信息之后,我们就可以基于当前的坐标节点,来划分出一个矩形的范围,来得知附近的人,如下图: 所以,我们很容易写出下列的伪 SQL 语句: SELECT id FROM positions WHERE x0 - r < x < x0 + r AND y0 - r < y < y0 + r 如果我们还想进一步地知道与每个坐标元素的距离并排序的话,就需要一定的计算。 当两个坐标元素的距离不是很远的时候,我们就可以简单利用 勾股定理 就能够得出他们之间的 距离 。不过需要注意的是,地球不是一个标准的球体, 经纬度的密度 是 不一样 的,所以我们使用勾股定理计算平方之后再求和时,需要按照一定的系数 加权 再进行求和。当然,如果不准求精确的话,加权也不必了。 参考下方

【c练习】二分查找(折半查找)

杀马特。学长 韩版系。学妹 提交于 2020-03-12 08:24:10
二分查找(折半查找) 定义 :二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。在C语言顺序存储结构中可更加快捷,时间复杂度更小的查找方式。 算法要求: 1. 必须采用顺序存储结构。 2.必须按关键字大小 有序排列 。 查找过程 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 举个栗子: //二分查找 //找到返回元素下标,找不到返回负一 # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <windows.h> int binarySearch ( int a [ ] , int key , int left , int right ) { //定义中间变量与要找元素作比较 while ( left <= right ) { int mid = left + ( right - left ) / 2 ; if ( a [ mid ] == key ) { return mid ; } else if ( a [

[LeetCode] 182.查找重复的电子邮箱

 ̄綄美尐妖づ 提交于 2020-03-12 07:03:48
编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。 示例 : +----+---------+ | Id | Email | +----+---------+ | 1 | a@b.com | | 2 | c@d.com | | 3 | a@b.com | +----+---------+ 根据以上输入,你的查询应返回以下结果: +---------+ | Email | +---------+ | a@b.com | +---------+ 说明 :所有电子邮箱都是小写字母。 题解: 方法一 :使用 GROUP BY 和临时表 算法 重复的电子邮箱存在多次。要计算每封电子邮件的存在次数,我们可以使用以下代码。 select Email, count(Email) as num from Person group by Email; | Email | num | |---------|-----| | a@b.com | 2 | | c@d.com | 1 | 以此作为临时表,我们可以得到下面的解决方案。 select Email from ( select Email, count(Email) as num from Person group by Email ) as statistic where num > 1; 方法二 :使用 GROUP BY 和

伸展树(三)之 Java的实现

落花浮王杯 提交于 2020-03-12 04:45:38
概要 前面分别通过C和C++实现了伸展树,本章给出伸展树的Java版本。基本算法和原理都与前两章一样。 1. 伸展树的介绍 2. 伸展树的Java实现(完整源码) 3. 伸展树的Java测试程序 转载请注明出处: http://www.cnblogs.com/skywang12345/p/3604286.html 更多内容 : 数据结构与算法系列 目录 (01) 伸展树(一)之 图文解析 和 C语言的实现 (02) 伸展树(二)之 C++的实现 (03) 伸展树(三)之 Java的实现 伸展树的介绍 伸展树(Splay Tree)是特殊的二叉查找树。 它的特殊是指,它除了本身是棵二叉查找树之外,它还具备一个特点: 当某个节点被访问时,伸展树会通过旋转使该节点成为树根。这样做的好处是,下次要访问该节点时,能够迅速的访问到该节点。 伸展树的Java实现 1. 基本定义 public class SplayTree<T extends Comparable<T>> { private SplayTreeNode<T> mRoot; // 根结点 public class SplayTreeNode<T extends Comparable<T>> { T key; // 关键字(键值) SplayTreeNode<T> left; // 左孩子 SplayTreeNode<T>

【数据结构】查找

风流意气都作罢 提交于 2020-03-11 23:15:00
平均查找长度(ASL, Average Search Length): 在查找过程中,一次查找的长度是指需要比较的关键字次数,而平均查找长度则是所有查找过程中进行关键字比较次数的平均值,(即 ASL= \(\sum\) 查找概率*比较次数 )(一般为等概率1/n) 静态查找表: 查找表的操作无需动态地修改查找表,如 顺序查找、折半查找、散列查找等。 动态查找表: 需要动态地插入或删除的查找表,如 二叉排序树、二叉平衡树、B树、散列查找等。 线性结构 顺序查找 适用条件: 适用于 线性表 基本思想: 从线性表的一段开始,逐个检查关键字是否满足给定的条件。若查找到某个元素的关键字满足给定的条件,则查找成功,返回该元素在线性表中的位置;若已经查找到表的另一端,但还没有查找到符合给定条件的元素,则返回查找失败的信息。 具体实现: typedef struct { //查找表的数据结构 ElemType *data; //元素空间基址,建表时按实际长度分配,0号单元留空 int length; //表的长度 }List; //Sequential Search Table //在顺序表L中顺序查找关键字为key的元素。若找到则返回该元素在表中的位置 int Search_Seq(List L, ElemType key) { L.data[0] = key; //“哨兵” for(i = L

java之二分查找法

不羁的心 提交于 2020-03-11 10:05:38
二分查找法 二分查找的基本思想是:将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果xa[n/2],则只要在数组a的右半部搜索x. 折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是:(这里假设数组元素呈升序排列)将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止;如 果xa[n/2],则我们只要在数组a的右 半部继续搜索x。 /* * 使用二分查找法的前提:数列是有序的,顺序存储结构 * * * 满足条件后采用折半的方式进行判断、查找, * * 折半数列,拿数列下标对应的元素与查找对象比较(默认数列为升序 小-->大) * 个人总结:先折半,再判断, * * * * * * */ public class TwoFindWay { public static void main(String[] args) { int[]array =new int[] {1,5,7,9,11,20,29,99};//array.length=8 Boss boss =new Boss(array); System.out.println(boss.find(6)); System.out.println