坐:
概览:
我有这样的东西:
std::vector<SomeType> values;
std::vector<int> indexes;
struct Range{
int firstElement;//first element to be used in indexes array
int numElements;//number of element to be used from indexed array
int minIndex;/*minimum index encountered between firstElement
and firstElements+numElements*/
int maxIndex;/*maximum index encountered between firstElement
and firstElements+numElements*/
Range()
:firstElement(0), numElements(0), minIndex(0), maxIndex(0){
}
}
std::vector<Range> ranges;
我需要对值进行排序、重新映射索引并重新计算范围以最小化每个范围的 maxValueIndex-minValueIndex。
详情:
values 是某种类型的数组(好吧,“vector ”)(与哪种类型无关)。 values 中的元素可能是唯一的,但不能保证这一点。
indexes 是一个整数 vector 。 "indexes"中的每个元素都是一个索引,对应于 values 中的某个元素。索引中的元素不是唯一的,一个值可能会重复多种类型。和 indexes.size() >= values.size()。
现在,范围 对应于索引 中的数据“ block ”。 firstElement 是 indexes 中要使用的元素的索引(即像这样使用:indexes[range.firstElement]),numElements(显然)是要使用的元素数,minIndex 是(索引中的最小值) [firstElement]...indexes[firstElement+numElements-1]) a,d maxIndex 在 (indexes[firstElement]...indexes[firstElement+numElements-1]) 中最大。范围从不重叠。 IE。对于每两个范围 a, b
((a.firstElement >= b.firstElement) && (a.firstElement < (b.firstElement+b.numElements)) == false
显然,当我对 values 进行任何操作(交换元素等)时,我需要更新索引(以便它们保持指向相同的值),并重新计算相应的范围,因此范围的minIndex 和 maxIndex 是正确的。
现在,我需要以最小化 Range.maxIndex - Range.minIndex 的方式重新排列值。我不需要打包后的“最好”结果,拥有“可能最好”或“好”的打包就足够了。
问题:
重新映射索引和重新计算范围很容易。问题是我不确定如何对 values 中的元素进行排序,因为在多个范围内可能会遇到相同的索引。
关于如何进行的任何想法?
限制:
不允许更改容器类型。容器应该是类似数组的。没有 map ,没有列表。 但是您可以在分类过程中随意使用任何您想要的容器。 此外,没有提升或外部库 - 纯 C++/STL,我真的只需要一个算法。
附加信息:
没有为 SomeType 定义更大/更小的比较 - 只有相等/不相等。 但是应该不需要比较两个值,只需要比较索引。
算法的目标是保证
的输出for (int i = 0; i < indexes.size; i++){
print(values[indexes[i]]); //hypothetical print function
}
将在排序前后相同,同时还要确保对于每个范围 Range.maxIndex-Range.minIndex(排序后)尽可能小,以合理的努力实现。 我不是在寻找“完美”或“最佳”解决方案,拥有“可能完美”或“可能最佳”解决方案就足够了。
附言这不是作业。
最佳答案
这不是算法,只是一些大声思考。如果重复太多,它可能会崩溃。
如果没有重复项,您只需重新排列值,使索引为 0、1、2,依此类推。所以对于起点,让我们排除被双重引用的值并安排其余的
由于存在重复项,您需要弄清楚将它们粘贴到哪里。假设拷贝由范围 r1、r2、r3 引用。现在,只要在 min([r1,r2,r3].minIndex)-1 和 max([r1,r2,r3].maxIndex)+1 之间插入重复项,maxIndex-minIndex 的总和将相同无论您将其插入何处。将插入点向左移动会减小左侧所有范围的最大最小值,但会增加右侧所有范围的最大最小值。因此,我认为明智的做法是在 r1、r2、r3 的最右侧范围(具有最大 minIndex 的范围)的左边缘(minindex)插入拷贝。重复所有重复项。
关于c++ - 对索引值数组进行排序、打包和重新映射,以尽量减少重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3164034/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我有多个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]
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我的瘦服务器配置了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
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][