就像谷歌地图一样,给定一百万个经纬度坐标列表,你将如何打印距离给定位置最近的k个城市?
我在一次面试中问了这个问题。面试官说这可以在O(n)中通过使用插入排序到k来完成,而不是对整个列表进行排序,即NlogN。我在网上找到了其他答案,大多数人都说NLogN...他[面试官]正确吗?
假设经纬度有给定的位数,我们实际上可以使用基数排序。这似乎与韩秋的答案相似,但我不确定是否是同一个答案。维基百科描述:
在计算机科学中,基数排序是一种非比较整数排序算法,它通过按共享相同有效位置和值的单个数字对键进行分组,对具有整数键的数据进行排序。需要位置表示法,但由于整数可以表示字符串(例如名称或日期)和特殊格式的浮点数,基数排序不限于整数。基数排序可以追溯到1887年赫尔曼·霍勒瑞斯在制表机上的工作。
关于效率,文章说了以下几点:
与其他排序算法相比,基数排序的效率这一主题有些棘手,容易引起很多误解。与基于比较的最佳算法相比,基数排序是否同样有效、效率更低或效率更高,取决于所做假设的细节。对于字长为w的整数的n个键,基数排序复杂度为O(wn)。有时w表示为常数,这将使基数排序比基于比较的最佳排序算法更好(对于足够大的n),这些算法都执行Θ(n log n)比较以对n个键进行排序。
在您的情况下,w
对应于您的纬度和经度的单词大小,即位数。特别是,对于坐标中较低的精度(较少的数字),这会变得更有效。nlogn
算法是否更有效取决于您的n
和您的实现。渐近地说,它比nlogn
更好。
显然,您仍然需要将两者结合到实际距离中。
这是一个quickselect算法(https://en.wikipedia.org/wiki/Quickselect)
基本上,它是一种经过修改的快速排序-每当你有两个半部分时,你只对其中一个进行排序:
完成后,您将在数组的前k个位置拥有最接近的k个元素(但它们不一定排序)。
因为每一步只处理一半,所以时间将是n/2 n/4 n/8=2n(忽略常量)。
对于保证的O(n),您始终可以选择一个好的枢轴,例如中间带(https://en.wikipedia.org/wiki/Median_of_medians).
我认为,在计算距离时,您可以维护K个元素的列表。
每次有新距离时,如果该距离小于最大距离,请将其插入列表,然后删除最大距离。
如果您使用的是排序数组,则此插入可以是O(k),如果您使用的是二进制堆,则可以是O(logK)。
在最坏的情况下,您将插入n次。总的来说,它将是O(NK)或O(NlogK)。如果K足够小,它就是O(N)。
问题内容: 我刚刚开始学习数据结构,并且在进行数组插入时想知道为什么数组插入的时间复杂度为O(n)而不是O(n + 1)? 在最佳情况下,当插入在最后时,时间复杂度为O(1)。我想我们正在考虑1插入元素,因为这里没有元素被移动。在最坏的情况下,假设我们必须移动n个元素然后插入新元素,那么时间时间复杂度是否应该为O(n + 1)?n用于移动元素,1用于插入。 非常感谢您的帮助。 问题答案: O(n)
查找p的伪码算法为: 假设我有一个int值的数组H[1到m],其中“p”是峰值元素,如果: 基本上,如果H【p】大于或等于其相邻元素,则H【p】为峰值。 假设数组H在开始和结束时都大于1个元素,数组为H[0到m 1],其中H[0]=H[m 1]=无穷大。因此,H[0]和H[m 1]是哨兵。然后是元素p,其中1≤ p≤ n、 是一个峰值,如果H【p-1】≤ H【p】≥ H【p 1】。 我认为渐近时间
我在GeekforGeekshttps://www.geeksforgeeks.org/minimum-number-of-jumps-to-reach-end-of-a-given-array/中检查“到达终点的最小跳跃次数”问题。我对这里提到的时间复杂度感到困惑,它是O(n^n)。 如果我看到上面的代码块,minJumps(arr,I,h)递归调用是从I=l1调用的。所以在每个递归步骤中,l(
我试图为这段代码找出一个大O的紧密界限: 如果我们从内最循环开始,它将在最坏的情况下运行k=n^2次,占O(N^2)。如果语句每次j=m*i时都为真,其中m是一个任意常数。由于j从1运行到i^2,这将在m={1,2,...,i}时发生,这意味着它将在i次时为真,i最多可以是n,所以最坏的情况将是m={1,2,...,n}=n次。如果i=n,第二个循环应该有O(N^2)的最坏情况。外环具有O(N)的
做O(h)算法的时间复杂度是多少?当h是节点的高度,以BST n倍为单位(树中的元素数),我相信是O(n),而不是O(n*h),但我不知道如何证明它。 在O(h)中工作的特定算法是在BST中查找元素的顺序前体。