草庐IT

algorithm

全部标签

c++ - 添加每个可能的 xor-sum 子数组的和的算法

我参加了一次算法竞赛。我遇到了一个问题,我在这里问同样的问题。问题陈述XOR-sumarray是对该子数组的所有数字进行异或。给你一个数组,你必须添加所有可能的异或子数组。为了更好的理解,问题陈述是here还有。示例输入数组:-12输出:-6解释F(1,1)=A[1]=1,F(2,2)=A[2]=2和F(1,2)=A[1]XORA[2]=1XOR2=3。因此答案是1+2+3=6。我的代码时间复杂度:-O(N^2),(效率低下,未参加比赛)#includeusingnamespacestd;longlongintinput[100001];main(){intT;intN;longlon

c++ - 自动更正算法

我想用C++实现以下内容:1)检查给定的单词是否存在于字典中。词典文件是一个巨大的文件;考虑100MB或3-4百万个单词。2)对不正确的词提出更正建议。3)自动完成功能。我的方法1)我打算build一棵树,这样搜索效率会更高。2)我不知道如何实现自动更正功能。3)我可以使用树实现自动完成功能实现上述所有功能的最佳数据结构和算法是什么? 最佳答案 我一直在研究同样的问题。到目前为止,我遇到的最好的解决方案是使用三元搜索树来自动完成。三元搜索树比尝试更节省空间。如果我无法在我的三元搜索树中找到查找的字符串,那么我将使用一个已经构建的BK

c++ - 使用 libpng 将位图缓冲区快速编码为 png

我的目标是使用C/C++将32位位图(BGRA)缓冲区实时转换为png图像。为了实现它,我使用了libpng库来转换位图缓冲区,然后写入一个png文件。然而,在单线程目标arm板(四核处理器)上执行似乎需要很长时间(~5秒)。在分析时,我发现libpng压缩过程(放气算法)占用了90%以上的时间。所以我试图通过以某种方式使用并行化来减少它。这里的最终目标是至少在0.5秒内完成。既然png可以有多个IDATblock,我想到了用多个IDAT并行编写png。采用以下方法编写具有多个IDAT的自定义png文件1.WritePNGIHDRchunk2.WriteIDATchunksinpara

c++ - 统计数字和等于 x*m 的数字和的数字 x 的个数

我试图解决以下问题,但我被卡住了。我认为这是一个动态规划问题。能否请您提供一些想法?问题:给定一个正数n(n例子:n=1,m=2结果=2n=18,m=1结果=1000000000000000000提前致谢。 最佳答案 首先,我们需要想出一个递归公式:从最低有效数字(LSD)到最高有效数字(MSD),如果在计算MSD之后,我们有一个有效的解决方案,我们有S(x)=S(x*m)要验证一个数是否是有效解,我们需要知道三件事:当前数字S(x)的和是多少当前数字和S(x*m)是多少当前数字是多少。所以,要回答第一个和最后一个,很容易,我们只需

c++ - 似乎很难找出这个简单程序的时间复杂度

我有下面的代码来模拟算法的递归行为,因为我没能弄清楚该算法的时间复杂度:intM(intn){intresult=1;for(inti=n-1;i>=0;--i){result+=M(i);}returnresult;}根据我的理解,我画了下面的树来说明算法:(图中输入n为3)。我认为树中节点的数量就是算法的复杂度。如果输入是n,时间复杂度是多少?谢谢! 最佳答案 我的背景不是CS,但我可以为您提供一种简单的方法来看待这个问题,所以我拿了纸和笔,开始使用不同的n值。n=2,cycles=4n=3,cycles=8n=4,cycles

c++ - 合并 2 个不同的 AVL 树

假设我有两棵AVL树并且我知道它们各自的大小。但是,我不知道是否有重复的节点,或任何其他信息。将它们合并到新的AVL树中的最有效方法是什么?原来的树木可以被摧毁。 最佳答案 将树T1和T2转换为排序列表L1和L2将L1和L2合并成一个排序列表L再次将L转换为树T。IIRC所有这些操作都是O(N),所以完全合并也将是O(N)。如果您对AVL树的表示允许高效地迭代它们(例如,使用反向指针、延续、惰性求值等),您也应该能够在没有中间列表的情况下执行此操作。更新:由于您的编程语言似乎是C/C++,您可以暂时滥用AVL节点结构作为链表中的节点

c++ - 计算斯特林数的动态规划方法

ints_dynamic(intn,intk){intmaxj=n-k;int*arr=newint[maxj+1];for(inti=0;i这是我使用动态规划确定斯特林数的尝试。定义如下:S(n,k)=S(n-1,k-1)+kS(n-1,k),if1S(n,k)=1,ifk=1ouk=n看起来不错,对吧?除非我运行单元测试...partitioningTest..\src\Test.cpp:443025==s_dynamic(9,3)expected:3025butwas:4414谁能看出我做错了什么?谢谢!顺便说一句,这是递归解决方案:ints_recursive(intn,int

c++ - C++中的年持续时间算法

我正在制作一个需要一年持续时间(time_t)的程序。换句话说,time_tofDD/MM/YYYY+duration=time_tofDD/MM/YYYY+1所以它可能并不总是365天(29/02/2012将变为28/02/2013)这是我附带的算法:ifYEARisleapthanifwearebeforethe29thfeb'thanreturn365+1dayselseifwearethe29thfeb'thanreturn365-1dayselsereturn365dayselseifYEAR+1isleapthanifwearebeforeorthe28thfeb'than

c++ - 用于 GPS 系统的 Dijkstra 算法的更快替代方案

如果涉及到算法,以及我为游戏制作的插件,我是一个真正的速度狂。速度是..有点..不满意。尤其是当你驾车四处行驶并且你没有按照你的路径行驶时,必须重新计算路径..这需要一些时间,所以游戏中的GPS正在叠加许多“错误的方向”信号(并叠加信号意味着以后要进行更多的计算,对于每一个错误的移动方式)因为我想要一个快速的实时gps系统,它会不断更新。我将旧算法(一些简单的dijkstra实现)更改为boost::dijkstra来计算从节点A到节点B的路径(总节点列表大约有15k个节点和40k个连接,对于好奇的人,这里是map:http://gz.pxf24.pl/downloads/prv2.j

c++ - 冒泡排序中的交换次数

我有一个冒泡排序的版本:inti,j;forifromndownto1{forjfrom1toi-1{if(A[j]>A[j+1])swap(A[j],A[j+1])}}我想使用上述版本的冒泡排序计算预期的交换次数。我使用的方法如下所示://0basedindexfloatans=0.0;for(inti=0;ia[j].}}我走的路是正确的还是我错过了什么? 最佳答案 获得答案的最佳方法是运行冒泡排序算法本身,并在swap()调用之后包含一个计数器。您的计算函数(a)几乎需要与排序本身一样长的时间(取决于swap()与getpro