草庐IT

algorithm

全部标签

c++ - 在双向迭代器上实现快速排序

使用具有O(NlgN)时间和O(lgN)空间的双向迭代器实现快速排序似乎非常简单。那么,std::sort()需要随机访问迭代器的特殊原因是什么?我已阅读有关该主题的文章whydostd::sortandpartial_sortrequirerandom-accessiterators?.但它没有解释可能的std::sort()实现的具体部分可能实际上需要随机访问迭代器来维持其时间和空间复杂度。O(NlgN)时间和O(lgN)空间的可能实现:templateBidirItpartition(BidirItfirst,BidirItlast,Predpred){while(true){w

c++ - 求大 n 和 k 模 m 的二项式系数

我想用以下约束计算nCkmodm:nkm=10^9+7我已阅读这篇文章:CalculatingBinomialCoefficient(nCk)forlargen&k但是这里m的值是1009,所以利用卢卡斯定理,我们只需要计算1009*1009个不同的aCb值,其中a,b如何在上述约束下做到这一点。我无法在给定约束条件下制作O(m*k)空间复杂度的数组。帮助! 最佳答案 (n,k)的二项式系数的计算公式为:(n,k)=n!/k!/(n-k)!为了对大数n和kmodulom进行此操作,请注意:一个数的阶乘m可以逐步计算,在每一步取结果%

c++ - 对这 n^2 个数字进行排序的最快方法是什么?

给定一个数字“n”,我想返回一个包含n^2个数字的排序数组,其中包含k1*k2的所有值,其中k1和k2的范围可以从1到n。例如对于n=2它将返回:{1,2,2,4}。(数字基本上是1*1,1*2,2*1,2*2)。对于n=3,它将返回:{1,2,2,3,3,4,6,6,9}。(数字是:1*1、2*1、1*2、2*2、3*1、1*3、3*2、2*3、3*3)我尝试使用c++标准库中的排序函数,但我想知道是否可以进一步优化它。 最佳答案 嗯,首先,你得到n^2个条目,其中最大的是n^2,并且在可能的值范围中,只有很小的一个值的数量用于较

c++ - 模棱两可的期望值

我在网站上看到这个问题(我不会使用确切的措辞或提及网站),Supposeakidgetshispocketmoneyonthe15thofeverymonth,accordingtowhichdayisitonthatdate,Letssayhegets1coinonMonday,2coinsonTuesday...7coinsonSunday.WhatistheExpectednumberofcoinshewillgetonthe15thofarandommonth?起初我虽然每个的概率是1/7所以答案应该是4,但它说错误答案。然后想了想如何选择一个随机月份,并记得日历每400年重复

c++ - 为什么样本不是随机填充我的 vector ?

我正在试验一个玩具sample程序:mapfoo{{1,'a'},{2,'b'},{3,'c'}};vector>bar(size(foo));sample(begin(foo),end(foo),begin(bar),size(foo),mt19937{random_device{}()});LiveExample但是bar总是按顺序包含foo的内容。这是gcc实现问题,还是我只是一再倒霉? 最佳答案 std::sample从您传递的范围中选择元素。来自cppreference(强调我的):Selectsnelementsfrom

c++ - 如何将元素从 std::list 复制到结构数组?

我需要将std::list的内容复制到数组中,其中数组是数组的结构。下面是它的代码实现。#include#includeusingnamespacestd;typedefstruct{intheight;intwidth;intlength;}dimensions;GetDimensions(list,*int);//Functionthatcopiesthecontentoflisttoarraypassedassecondparameterintmain(){dimensionscuboid[10];intplane[10];listplaneList=GetList();//Fu

c++ - 寻找哈希函数/Ordered Int/to/Shuffled Int/

我正在寻找可以将有序整数索引值更改为随机哈希索引的恒定时间算法。如果它是可逆的就好了。我需要每个索引的哈希键都是唯一的。我知道这可以通过在大文件中查找表格来完成。IE。创建一个有序的所有整数集,然后随机打乱它们并以随机顺序写入文件。然后您可以在需要时读回它们。但这需要搜索一个大文件。我想知道是否有一种简单的方法可以使用伪随机生成器来根据需要创建序列?GeneratingshuffledrangeusingaPRNGratherthanshufflinganswer经过erikkallen的线性反馈移位寄存器看起来是正确的事情。我刚刚试过了,但它会产生重复和孔洞。问候大卫·艾伦·芬奇

c++ - 就地 union 排序 vector

我想要一种有效的方法来将已排序的vector与另一个已排序的vector进行就地union。就地而言,我的意思是算法不应该创建一个全新的vector或其他存储来存储union,即使是临时的。相反,第一个vector应该简单地增长新元素的数量。类似于:voidinplace_union(vector&A,constvector&B);之后,A包含AunionB的所有元素and被排序。std::set_union在不会工作,因为它会覆盖其目标,即A。另外,这是否可以只通过一次传递两个vector来完成?编辑:同时A和B中的元素应该只在A中出现一次。 最佳答案

c++ - 在数组中查找整数的有效分配(具有给定顺序的排列)

我在寻找一个好的算法来为不同数组中的某些整数生成每个可能的赋值时遇到一个普遍问题。假设我有n个数组和m个数字(我可以有比数字更多的数组,比数组更多的数字或与数字一样多的数组)。例如,我有数字1、2、3和三个数组:{}、{}、{}现在我想找到以下每个解决方案:{1,2,3},{},{}{},{1,2,3},{}{},{},{1,2,3}{1,2},{3},{}{1,2},{},{3}{},{1,2},{3}{1},{2,3},{}{1},{},{2,3}{},{1},{2,3}{1},{2},{3}所以基本上我想找到每个可能的组合,以将数字分配给不同的数组并保持顺序。所以在这个例子中,1

c++ - 如何为关联容器应用 std::accumulate 算法?

对于像std::map这样的映射,我如何计算它的值总和?实际上,我是用仿函数和std::for_each算法实现的。但我也想使用std::accumulate算法来实现。我不知道如何将它应用到std::map。这可能吗?structAccumurator:std::unary_function,void>{Accumurator():totalValue_(0){}voidoperator()(conststd::pair&p){totalValue_+=p.second;}intresult()const{returntotalValue_;}inttotalValue_;};int