- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
也许我没有在寻找/搜索正确的关键字(我找不到解决方案)。
我正在尝试以节省空间的方式计算数字列表(不断更新)的中位数。
要计算均值,有一个很好的方法,即记住列表中元素的数量并对旧均值加权。例如(伪代码):
// Initialize values
noList = [8,10,4,6]
mean = 0
noItems = 0
// Now we want to update the mean continually with further values.
for (value : noList) {
mean = (noItems / (noItems + 1)) * mean + (1 / (noItems + 1)) * value
noItems = noItems + 1
}
// After iteration 1: wholeList = [8] ; mean = 8 ; noItems = 1
// After iteration 2: wholeList = [8,10] ; mean = 9 ; noItems = 2
// After iteration 3: wholeList = [8,10,4] ; mean = 7.33; noItems = 3
// After iteration 4: wholeList = [8,10,4,6]; mean = 7 ; noItems = 4
问题:是否有类似的(节省空间的)方法来计算中位数?
已更新我更新了问题(感谢@WillemVanOnsem)。我不仅在寻找不断更新中位数,而且还在寻找一种节省空间的方法。根据他的提示,我们可以保留两个数据结构。
Example:
// 1) We have a list for which we want to find the median.
noList = [9,10,4,6,13,12]
// 2) We devide it into two list or datastructures (additionally we sort it).
smallerList = [4,6,9]
biggerList = [10,12,13]
// 3) Both list have the same length, so the median is between the last element of smallerList und the first element of biggerList.
median = (9 + 10) / 2 = 9.5
// 4) Next, we add a further element and want to update our median.
// We add the number 5 to our datastructures. So the new list is:
noList = [9,10,4,6,13,12,5]
// 5) Obviously 5 is smaller than our current median of 9.5. So we insert it in a sorted way into smallerList:
smallerList = [4,5,6,9]
biggerList = [10,12,13]
// 6) Now length(smallerList) > length(biggerList), So, we know, that the updated median should be the last element of smallerList.
median = 9
// 7) Next, we add a further element and want to update our median.
// We add the number 2 to our datastructures. So the new list is:
noList = [9,10,4,6,13,12,5,2]
// 8) Obviously 2 is smaller than our current median of 9. So we insert it again in a sorted way into smallerList:
smallerList = [2,4,5,6,9]
biggerList = [10,12,13]
// 9) Now the length of smallerList is much bigger than the length of biggerList and we need to "balance" our list by taking one element from one list and inserting it into the other list.
// We remove the element 9 from smallerList and insert it into biggerList.
smallerList = [2,4,5,6]
biggerList = [9,10,12,13]
// 10) Both list have the same length, so the median is between the last element of smallerList und the first element of biggerList.
median = (6 + 9) / 2 = 7.5
希望,这能说明问题。我猜,这是你的暗示 (@WillemVanOnsem)。
是的,这可能会回答我最初的问题...但此解决方案的问题是,两个列表(smallerList 和 biggerList)可能会增长到相当大的规模。假设我们有一个 10^18 数字流,我们想在不超出内存的情况下找到所有数字的中位数。如何以节省空间的方式解决这个问题?
最佳答案
如果不记住您见过的所有数字,就无法做到这一点,因为在任何时候,您过去见过的任何数字都可能成为 future 的中位数。
如果你到目前为止已经看到了 n 个数字,那么对于任何 i,其中的 i 最小的一个可能成为中位数:
如果 i > n/2,那么如果接下来的 2i - n 个数字更大,就会发生这种情况。
如果 i <= n/2,那么如果接下来的 n - 2i + 1 个数字更小,就会发生这种情况。
<关于algorithm - 不断更新中位数+空间效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56621351/
第一个 .on 函数比第二个更有效吗? $( "div.container" ).on( "click", "p", function(){ }); $( "body" ).on( "click",
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 7 年前。 Improve
我有这样的查询: $('#tabContainer li'); JetBrains WebStorm IDE 将其突出显示为低效查询。它建议我改用这个: $('#tabContainer').find
我刚刚在 coursera ( https://www.coursera.org/saas/) 上听了一个讲座,教授说 Ruby 中的一切都是对象,每个方法调用都是在对象上调用发送方法,将一些参数传递
这可能是用户“不喜欢”的另一个问题,因为它更多的是与建议相关而不是与问题相关。 我有一个在保存和工作簿打开时触发的代码。 它在 f(白天与夜晚,日期与实际日期)中选择正确的工作表。 周一到周三我的情况
这只是我的好奇心,但是更有效的是递归还是循环? 给定两个功能(使用通用lisp): (defun factorial_recursion (x) (if (> x 0) (*
这可能是一个愚蠢的问题,但是while循环的效率与for循环的效率相比如何?我一直被教导,如果可以使用for循环,那我应该这样做。但是,实际上之间的区别是什么: $i = 0; while($i <
我有一个Elasticsearch索引,其中包含几百万条记录。 (基于时间戳的日志记录) 我需要首先显示最新记录(即,按时间戳降序排列的记录) 在时间戳上排序desc是否比使用时间戳的函数计分功能更有
使用Point2D而不是double x和y值时,效率有很大差异吗? 我正在开发一个程序,该程序有许多圆圈在屏幕上移动。他们各自从一个点出发,并越来越接近目的地(最后,他们停下来)。 使用 .getC
我正在编写一个游戏,并且有一个名为 GameObject 的抽象类和三个扩展它的类(Player、Wall 和 Enemy)。 我有一个定义为包含游戏中所有对象的列表。 List objects; 当
我是 Backbone 的初学者,想知道两者中哪一个更有效以及预期的做事方式。 A 型:创建一个新集合,接受先前操作的结果并从新集合中提取 key result = new Backbone.Coll
最近,关于使用 LIKE 和通配符搜索 MS SQL 数据库的最有效方法存在争论。我们正在使用 %abc%、%abc 和 abc% 进行比较。有人说过,术语末尾应该始终有通配符 (abc%)。因此,根
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我想知道,这样做会更有效率吗: setVisible(false) // if the component is invisible 或者像这样: if(isVisible()){
我有一个静态方法可以打开到 SQL Server 的连接、写入日志消息并关闭连接。我在整个代码中多次调用此方法(平均每 2 秒一次)。 问题是 - 它有效率吗?我想也许积累一些日志并用一个连接插入它们
这个问题在这里已经有了答案: Best practice to avoid memory or performance issues related to binding a large numbe
我为我的 CS 课(高中四年级)制作了一个石头剪刀布游戏,我的老师给我的 shell 文件指出我必须将 do while 循环放入运行者中,但我不明白为什么?我的代码可以工作,但她说最好把它写在运行者
我正在编写一个需要通用列表的 Java 应用程序。该列表需要能够经常动态地调整大小,对此的明显答案是通用的Linkedlist。不幸的是,它还需要像通过调用索引添加/删除值一样频繁地获取/设置值。 A
我的 Mysql 语句遇到了真正的问题,我需要将几个表连接在一起,查询它们并按另一个表中值的平均值进行排序。这就是我所拥有的... SELECT ROUND(avg(re.rating
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Is there a difference between i==0 and 0==i? 以下编码风格有什么
我是一名优秀的程序员,十分优秀!