当前位置: 首页 > 知识库问答 >
问题:

找出年龄流的中位数

汤兴生
2023-03-14

最近,有人给了我一个编码问题,其中的陈述是,我将得到一串人的年龄,然后在任何时候都会要求中位数。

像这样的东西:

add(20)
add(30)
add(30)
add(40)
getMedian() // prints 30

现在这个问题类似于这个Leetcode问题:

从数据流中查找中位数

所以我给出了2堆的方法 - 一个最大堆和一个最小堆。

面试官没有留下深刻印象,暗示可能存在优化,因为可以假设所有人的年龄都在1到130之间,而且会有很多重复的年龄,例如,有很多人的年龄在20岁。

我无法想出任何更好的优化,所以我给出了一种方法,用HashMap计算所有频率,然后计算发生次数。这是完全不正确的。

我在这里错过了什么?年龄限制如何帮助我?

编辑:

这里回答:https://stackoverflow.com/a/23603511/7134737

共有1个答案

孙宏扬
2023-03-14

面试官可能正在寻找的方法是这样的。

保持一组频率计数。

维护数组的总计数。

维护一个变量,说明中值在哪个桶中,以及它在该桶中的第二个位置。

插入是O(1),因为您必须更新数组条目、更新总计数、更新您在中值存储桶中的位置,并且偶尔扫描固定数量的存储桶以查找下一个有条目的存储桶。

返回中值也是<code>O(1),因为您在一个可以查找的变量中维护该答案。

使用HashMap而不是数组只是常量因子不同。但是,必须按需计算答案的速度较慢。

请注意,此答案针对中位数进行了优化。假设我们想计算任何特定的百分比。我们可以使用不同的html" target="_blank">数据结构使其变得简单。

我会用一个257元素数组来解决这个,排列如下:

0: 0
1: Count of people aged 0
2: Count of people aged 0 or 1
3: Count of people aged 2
4: Count of people aged 0, 1, 2, or 3
5: Count of people aged 4
6: Count of people aged 4 or 5
7: Count of people aged 6
8: Count of people aged 0, 1, 2, 3, 4, 5, 6, or 7
...

一般来说,2^i*jth条目,带有j奇数,将是范围2^i*(j-1)2^i*j-1

为了插入一个值,我从n 1开始,跳到增加2的幂,最多8个条目。例如,如果我有一个 21 岁的用户要插入到数据结构中,我会在 22、24、32、64、125 和 256 处递增这些值。

为了计算小于或等于21的人的数量,我同样用2的幂向下看。所以我会读取 22、20、16 和 0 的值。

为了获得数据结构中的总人数,我将查看位置256中的值。

要找到一个特定的计数落在哪个年龄更复杂。我会按2的幂下降,然后进行二分查找。所以假设最终答案是21。我必须查看256、128、64、32、16,然后锁定在年龄范围0...15。然后通过查看24和20来查找16...31岁的人。这锁定了16...19岁的人。重复22、21并锁定20岁的人。我的答案是在21岁的某个地方。

在给定的示例中,此数据结构对于所有操作都是O(1),因为它具有固定的大小。但是如果您有更多的存储桶,那么所有操作都是O(log(#of桶))

 类似资料:
  • 问题内容: 目的:JComboBox列出用户可以选择的年龄 我意识到我需要一个整数数组。Java中Math函数的哪一部分可以让我轻松地做到这一点?数字列表将按顺序从1-100开始。 问题答案: 我不太明白为什么需要数学函数。 这将工作:

  • 问题内容: 在SQL Server数据库中,我记录了人们的出生日期。是否有仅使用SQL来计算给定日期的人的年龄的简单方法? 使用 DATEDIFF(YEAR,DateOfBirth,GETDATE()) 不起作用,因为它仅查看日期的年份部分。例如 DATEDIFF(YEAR,‘2007年12月31日’,‘2008年1月1日’) 返回1。 问题答案: 查看本文:如何使用SQL代码计算一个人的年龄 这

  • 问题内容: 我有一个InnoDB表和一个列索引,就像这样 我只想了解这些查询背后的真实情况: 和 据我了解,第一个MySQL将使用列寿命索引,而第二个则无法使用。是吗?哪个对性能更好? 问题答案: 这两个查询都将使用索引。 查询A将转换为: 查询B将转换为 因此查询A将使用OR进行3个测试。 查询B将使用AND进行2个测试。 查询B更快。 通常,使用的查询比使用的查询要快。 另外,查询B执行的测试

  • 问题内容: 我正在尝试使用以下格式为每个人打印其年龄: 例如:19年8个月13天。 我已经在Google上搜索了很多,并且注意到有一个特定的函数可以计算日期之间的差。 但是,该功能在中不存在,因此我继续尝试使用和一些运算符。 我的尝试: 我的问题取决于日子。我不知道如何使用此函数计算天数(“尝试除以4或30”);我以为我的逻辑不好,但我无法弄清楚,有什么想法吗? 问题答案: 与Lalit的答案非常

  • 问题内容: 考虑到他们的DOB格式为dd / mm / yyyy,我正在寻找一种计算人的年龄的方法。 我一直在使用以下功能,该功能在几个月内都可以正常工作,直到某种故障导致while循环永远不会结束并且使整个站点陷入瘫痪。由于每天有近100,000个DOB多次通过此功能,因此很难确定造成此问题的原因。 有人有更可靠的年龄计算方法吗? 编辑:此函数的某些时间似乎可以正常工作,但对于14年9月14日的

  • 问题内容: 这个问题已经在这里有了答案 : 在MySQL中获取一个人的年龄 (2个答案) 6年前关闭。 我在mysql中有一个表,它的出生日期列保存为unix时间戳(bigint)。 我想这样写查询: 和 3点是从出生日期算起年龄的函数。 我知道该函数,但是如果将出生日期另存为unix时间戳,那就不好了。 我能做些什么? 谢谢 问题答案: 从MySQL的日期和时间函数,我们可以结合,和。 假设这是