首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

大厂算法面试:使用移动窗口查找两个不重叠且元素等于给定子数组

如果是白板面试,也就是你跟面试官面对面,那么拿到题目后不要立刻着手,而是要跟他澄清一些疑问,例如你可以问:1,如果数组为空,或者数组没有满足条件子数组,那应该返回什么,面试官可能回答返回0或者空;...策略如下,我们使用一种叫滑动窗口办法,所谓窗口其实就是两个标记:start, end,它分别对应窗口起始结束位置,例如start = 0, end = 2,那么这个窗口所包含元素就是[1,2,1...使用滑动窗口我们能方便找到元素等于给定子数组。注意到数组只包含正整数,因此如果保持start不变,end向右边移动,那么窗口内部元素就会变大,如果保持end不变,那么窗口内元素就会减小。...如此类推,我们从数组最左端出发,如果窗口内元素小于给定指定,那么就向右移动end,如果大于给定,那么就像左移动一个单位,当窗口挪出数组,也就是end大于数组最后一个元素下标时,查找结束,当前能找到所有满足元素等于特定所有子数组...首先使用对应sub_array记录当前找到满足条件子数组,使用subarray_index作为遍历队列标记。

1.6K20

Redis 到底是怎么实现“附近的人”这个功能呢?

其中,组合使用GEOADDGEORADIUS可实现“附近的人”中“增”“查”基本功能。要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...(&long_range,&lat_range); //将待查经纬度按指定精度(steps)编码成geohash geohashEncode(&long_range,&lat_range,longitude...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点...所以在查询时,只要找到集合中处在目标geohash网格中第一个,后续依次对比即可,不用多次查找。九宫格不能一起查,要一个个遍历原因也在于九宫格各网格对应geohash不具有连续性。...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)),其中N为指定半径范围位置元素数量,而M则是被九宫格圈住计算距离元素数量。

1.1K10
您找到你想要的搜索结果了吗?
是的
没有找到

用 Redis 查询 “附近的人” !妙啊!

其中,组合使用GEOADDGEORADIUS可实现“附近的人”中“增”“查”基本功能。要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...(&long_range,&lat_range); //将待查经纬度按指定精度(steps)编码成geohash geohashEncode(&long_range,&lat_range...(&hash,&neighbors); //根据hash确定area经纬度范围 geohashDecode(long_range,lat_range,hash,&area); //...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点...所以在查询时,只要找到集合中处在目标geohash网格中第一个,后续依次对比即可,不用多次查找。 九宫格不能一起查,要一个个遍历原因也在于九宫格各网格对应geohash不具有连续性。

22640

Redis 到底是怎么实现“附近的人”这个功能

其中,组合使用GEOADDGEORADIUS可实现“附近的人”中“增”“查”基本功能。 要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...(&long_range,&lat_range); //将待查经纬度按指定精度(steps)编码成geohash geohashEncode(&long_range,&lat_range...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点...所以在查询时,只要找到集合中处在目标geohash网格中第一个,后续依次对比即可,不用多次查找。 九宫格不能一起查,要一个个遍历原因也在于九宫格各网格对应geohash不具有连续性。...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)) 其中N为指定半径范围位置元素数量,而M则是被九宫格圈住计算距离元素数量。

89930

看用 Redis 如何实现微信「​附近的人」​功能?

前言:针对“附近的人”这一位置服务领域应用场景,常见使用PG、MySQLMongoDB等多种DB空间索引进行实现。...其中,组合使用GEOADDGEORADIUS可实现“附近的人”中“增”“查”基本功能。 要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...(&long_range,&lat_range); //将待查经纬度按指定精度(steps)编码成geohash geohashEncode(&long_range,&lat_range,longitude...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)) 其中N为指定半径范围位置元素数量,而M则是被九宫格圈住计算距离元素数量。

89950

IM里“附近的人”功能实现原理是什么?如何高效率地实现它?

其中,组合使用GEOADDGEORADIUS可实现“附近的人”中“增”“查”基本功能。要实现类似于微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...使用注意点: 1)Redis GEO操作中只包含了“增”“查”操作,并无专门“删除”命令。...geohash geohashEncode(&long_range,&lat_range,longitude,latitude,steps,&hash); //将geohash在8...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点...所以在查询时,只要找到集合中处在目标geohash网格中第一个,后续依次对比即可,不用多次查找。 九宫格不能一起查,要一个个遍历原因也在于九宫格各网格对应geohash不具有连续性。

1.8K00

Redis 到底是怎么实现“附近的人”这个功能

其中,组合使用GEOADDGEORADIUS可实现“附近的人”中“增”“查”基本功能。 要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...(&long_range,&lat_range); //将待查经纬度按指定精度(steps)编码成geohash geohashEncode(&long_range,&lat_range...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点...所以在查询时,只要找到集合中处在目标geohash网格中第一个,后续依次对比即可,不用多次查找。 九宫格不能一起查,要一个个遍历原因也在于九宫格各网格对应geohash不具有连续性。...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)) 其中N为指定半径范围位置元素数量,而M则是被九宫格圈住计算距离元素数量。

77920

Redis 是怎么实现 “附近的人”

针对“附近的人”这一位置服务领域应用场景,常见使用PG、MySQLMongoDB等多种DB空间索引进行实现。...其中,组合使用GEOADDGEORADIUS可实现“附近的人”中“增”“查”基本功能。 要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...(&long_range,&lat_range); //将待查经纬度按指定精度(steps)编码成geohash geohashEncode(&long_range,&lat_range...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)) 其中N为指定半径范围位置元素数量,而M则是被九宫格圈住计算距离元素数量。

1.4K10

Redis 实现「附近的人」

前言:针对“附近的人”这一位置服务领域应用场景,常见使用PG、MySQLMongoDB等多种DB空间索引进行实现。...其中,组合使用GEOADDGEORADIUS可实现“附近的人”中“增”“查”基本功能。要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...(&long_range,&lat_range); //将待查经纬度按指定精度(steps)编码成geohash geohashEncode(&long_range,&lat_range...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点...所以在查询时,只要找到集合中处在目标geohash网格中第一个,后续依次对比即可,不用多次查找。 九宫格不能一起查,要一个个遍历原因也在于九宫格各网格对应geohash不具有连续性。

69520

揭开Redis“附近的人”神秘面纱

其中,组合使用GEOADDGEORADIUS可实现“附近的人”中“增”“查”基本功能。 要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...(&long_range,&lat_range); //将待查经纬度按指定精度(steps)编码成geohash geohashEncode(&long_range,&lat_range...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点...所以在查询时,只要找到集合中处在目标geohash网格中第一个,后续依次对比即可,不用多次查找。 九宫格不能一起查,要一个个遍历原因也在于九宫格各网格对应geohash不具有连续性。...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)) 其中N为指定半径范围位置元素数量,而M则是被九宫格圈住计算距离元素数量。

93820

Redis 到底是怎么实现“附近的人”这个功能呢?

前言 针对“附近的人”这一位置服务领域应用场景,常见使用PG、MySQLMongoDB等多种DB空间索引进行实现。...其中,组合使用GEOADDGEORADIUS可实现“附近的人”中“增”“查”基本功能。要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...(&long_range,&lat_range); //将待查经纬度按指定精度(steps)编码成geohash geohashEncode(&long_range...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)),其中N为指定半径范围位置元素数量,而M则是被九宫格圈住计算距离元素数量。

1.9K10

简单几步,实现 Redis 查询 “附近的人”

前言:针对“附近的人”这一位置服务领域应用场景,常见使用PG、MySQLMongoDB等多种DB空间索引进行实现。...其中,组合使用GEOADDGEORADIUS可实现“附近的人”中“增”“查”基本功能。 要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。...(&long_range,&lat_range);      //将待查经纬度按指定精度(steps)编码成geohash     geohashEncode(&long_range,&lat_range...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)) 其中N为指定半径范围位置元素数量,而M则是被九宫格圈住计算距离元素数量。

59420

利用 Redis 实现“附近的人”功能!

针对“附近的人”这一位置服务领域应用场景,常见使用 PG、MySQL MongoDB 等多种 DB 空间索引进行实现。...其中,组合使用 GEOADD GEORADIUS 可实现“附近的人”中“增”“查”基本功能。 要实现微信中“附近的人”功能,可直接使用 GEORADIUSBYMEMBER 命令。...源码分析 /* GEOADD key long lat name [long2 lat2 name2 ... longN latN nameN] */ void geoaddCommand(client...再依次查找计算九宫格中点(蓝点红点)与中心点距离,最终筛选出距离范围点(红点)。 算法分析 为什么要用这种算法策略进行查询,或者说这种策略优势在哪,让我们以问答方式进行分析说明。...所以在查询时,只要找到集合中处在目标 GEOHASH 网格中第一个,后续依次对比即可,不用多次查找。 九宫格不能一起查,要一个个遍历原因也在于九宫格各网格对应 GEOHASH 不具有连续性。

97220

3分钟短文 | Laravel 自定义 SQL 查询参数绑定

) ) * sin( radians( lat ) ) ) 其中问号位置就是我们需要填入变量数据,也就是一个经纬度坐标,根据参照点,计算出数据库内每条记录该点距离参照点距离。...如果大家经常使用laravel调试功能的话,应该会注意到,这种问号写法是laravel本身封装SQL语句用。...); 上面的语句只用了select方法,其他筛选排序,与上一节代码相同,不需要调用 setBindings 方法。...))*sin(radians(lat)))) AS distance SQL; 首先拼装好SQL语句字段,然后使用laravel模型方法: $property = Property::selectRaw...; 写在最后 本文通过三种方式实现了laravel模型进行复杂自定义查询, 其中提供了两种参数绑定方式,我们推荐使用 selectRaw 方式, 更为直观。

2K40

Geohash算法原理及实现

文章目录 经纬度常识 基本原理 Geohash算法 问题 代码实现 geohash在mysql中使用 最近需要实现一个功能,查找车辆附近加油站,如果车和加油站距离在200米以内,则查找成功...纬线:地球仪上横线,lat,赤道是最大纬线,从赤道开始分为北纬和南纬,都是0-90°,纬线是角度数值,并不是米; 经线:地球仪上竖线,lng,子午线为0°,分为西经东经,都是0-180°,经线也是角度数值...; 经纬线换算:经度或者纬度0.00001度,约等于1米,这个在GPS测算距离时候可以体会到,GPS只要精确到小数点后五位,就是10米范围精度 经度0度位置为本初子午线,在180度位置转为西经...上例最终得到为 wx4g0ec1 Geohash比直接用经纬度高效很多,而且使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己精确坐标,有助于隐私保护。...相邻区域绿点明显离红点更近。但因为黄点编码红点一样,最终找到将是黄点。这就有问题了。 要解决这个问题,很简单,只要再查找周边8个区域点,看哪个离自己更近即可。 另外就是曲线突变问题。

1.6K20

Geohash算法原理及实现

最近需要实现一个功能,查找车辆附近加油站,如果车和加油站距离在200米以内,则查找成功。 加油站数量肯定不小,能否缩小查找范围,否则以遍历形式,效率肯定高不了。...上例最终得到为 wx4g0ec1 Geohash比直接用经纬度高效很多,而且使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己精确坐标,有助于隐私保护。...相邻区域绿点明显离红点更近。但因为黄点编码红点一样,最终找到将是黄点。这就有问题了。 要解决这个问题,很简单,只要再查找周边8个区域点,看哪个离自己更近即可。 另外就是曲线突变问题。...其中01111000两个编码非常相近,但它们实际距离确很远。所以编码相近两个单位,并不一定真实距离很近,这需要实际计算两个点距离才行。...不过仍然有一个问题需要解决,就是如何计算周边8个区域key呢 假设我们计算key是6位,那么二进制位数就是 6*5 = 30位,所以经纬度分别是15位。我们以纬度为例,纬度会均分15次。

65620

【c++算法篇】双指针(下)

sort(nums.begin(),nums.end()); } }; 具体讲解一下我们思路: 这里使用是一种双指针技术:固定最长边(也就是数组中最大),使用两个指针来查找剩余部分中可能两个较短边...由于数组已经排序,所有在 pre lat 之间元素与 nums[lat] 都会大于 nums[i],所以我们可以将 lat - pre 个三角形加到 count 上 然后将 lat 向左移动一位...在每次循环中,计算两个指针指向,判断这个与目标值 target 关系: 如果大于 target,那么为了减小,last 指针左移(减小索引) 如果小于 target,那么为了增大和...解决方法是在找到一个符合条件组合后,跳过所有相同元素 遍历策略:外层循环遍历数组,内层使用双指针从两端向中间查找两个其他元素,以保证三个数为零 跳过重复元素: 在外层循环中,如果当前数字与前一个数字相同...左右指针: 二分查找:在有序数组中查找元素,使用左右指针限定查找范围 双指针方法关键在于,指针移动可以依据问题规律来减少不必要比较或计算,从而提高算法效率。

7210

geohash之2d 地理空间索引

例如,您可能会写一个查询来查找餐馆距离酒店特定距离,或查找某个特定邻域博物馆。 本文档介绍了如何在文档中存储位置数据以及如何创建地理空间索引。...使用 bucketSize参数ensureIndex)(确定接近。甲 bucketSize5创建组位置是5个单位指定经度纬度范围索引。 bucketSize还决定索引粒度。...: 126.9, lat : 35.2 }, type : "restaurant"} { _id : 200, pos: { long : 127.5, lat : 36.1 }, type : "...然后,为每个象限分配一个两位。例如,四个象限两位表示将是: 01 11 00 10 这两个位,00,01,10,11,每个代表每个象限象限所有点。...42.3 ], [ -74, 44.74 ], { "lat": 55.3, "long": 40.2 } ] } 数组可以是阵列保持坐标

2.2K40

PHP进阶学习之Geo地图定位算法详解

分享给大家供大家参考,具体如下: 前言 日常开发中我们经常需要查找某个物体定位,或者查找附近范围等,我们自然而然会想到方法就是利用各种提供服务地图网站API,基于API,用经纬度去实现定位查找附近范围等等...当然精确范围也是根据经纬度hash范围来确定,如下表,geo精确到8位共同前缀,可以表示附近约20米范围了: ?...,所以目前行业内已经有了很多存储组件提供了直接计算存储方案,如MongoDB,适合在国内云平台直接使用。...实际应用中我们常常以商品、人物作为value,以geohash作为score,这样就可以搜索一定范围score的人或事物了。...and latitude * @param $lat * @param $long * @return string */ public function calcGeoHash($lat,$long

1.3K20
领券