背景:
在艰难的时限内,我需要处理数十万个事件(产生结果)。时钟实际上是滴答滴答,并且当计时器启动时,必须清除此时的所有操作。
到那个时候尚未准备好的东西要么被丢弃(取决于重要性度量),要么在下一个时间范围内处理(具有“重要性提升”,即在重要性度量中添加常数)。
现在,理想情况下,CPU的速度比所需的要快得多,并且整个设备在时间片结束之前很长时间就可以准备好了。不幸的是,世界很少有理想的,“数十万”变成了“数千万”。
事件进入时将事件添加到队列的后面(实际上是一个 vector ),并在各个下一量子期间从前端进行处理(因此程序始终会处理最后一个量子的输入)。
但是,并非所有事件都同样重要。如果可用时间不足,则最好丢弃不重要的事件,而不是重要的事件(这不是严格的要求,因为重要事件将被复制到下一个量子队列中,但是这样做会进一步增加负担因此它不是一个完美的解决方案)。
当然,要使用的显而易见的事情是优先级队列/堆。不幸的是,堆放10万个元素也不是完全免费的操作(或并行操作),然后我最终将对象放在了一些非显而易见的且不一定是缓存友好的内存位置,并且从优先级队列中提取元素并没有很好地并行化。
我真正想要的是某种经过排序的 vector ,或者至少是“某种程度近似排序的” vector ,之后可以依次遍历。这将平凡地允许我创建例如12个线程(或任何其他数量,每个CPU一个)处理例如每个范围的1/64(或其他大小),从前端到末端缓慢前进,最后掉落/推迟剩余的内容-这将是不重要的事件,可以丢弃。
仅使用std::sort对整个范围进行排序将是最简单,最直接的解决方案。但是,排序项目所花费的时间减少了在固定时间预算内可用于实际处理元素的时间,并且排序时间大部分是单CPU时间(并行排序也不是那么好)。
同样,进行完美排序(实际上并不需要)可能会带来最坏的情况,而理想情况下,近似排序应该以最佳状态执行并且成本可预测。
tl; dr
因此,我正在寻找的是一种仅以近似但快速的方式对数组/vector 进行排序的方法,并且具有可预测的(或保证的)运行时间。
排序键是一个通常在10到1000之间的小整数。被推迟到下一次,quantum可能会将该值增加(例如,“priority boost”)一小部分。 100或200。
在有人应该使用“主观比较”(?)进行近似排序的different question中,提出了 shell排序。在各种排序演示小程序上,至少对于这些中的典型“随机随机播放”输入来说,shell排序确实可以执行“近似排序”,在3-4次传递数据的过程中看起来并不算太糟(并且至少读取是严格按顺序进行的)。不幸的是,选择效果良好的间隙值似乎有点荒唐,而运行时估计似乎也涉及到对 Crystal 球的大量考察。
具有相对较大收缩因子(例如2或3?)的comb sort 似乎也很吸引人,因为它严格按顺序(两次轻击)访问内存,并且能够快速地将元素移出很远的距离。再次,从对演示小程序进行排序来看,似乎3-4次通过已经给出了一个相当合理的“近似排序”。
想到了 MSD基数排序,尽管我不确定给定的典型16/32bit整数(其中大多数最高有效位都为零)将如何执行!可能需要进行一次初始遍历才能找到整个集合中的最高有效位,然后再进行2-3次实际排序遍历?
我提到的一种算法是否有更好的算法或众所周知的工作方法?
最佳答案
我想到的是遍历 vector ,如果某个事件不太重要,则不要处理它,而将其放在一边。读取完所有 vector 后,立即查看放置的事件。当然,您可以使用多个具有不同优先级的存储桶。并且仅在其中存储引用,您不想移动兆字节的数据。 (现在已按Damon的要求发布为答案)
关于c++ - 近似排序(数组/vector ),可预测的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21434718/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife