问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助,pascal编程搜索算法的优化,呼叫大牛!!!

发布网友 发布时间:2022-06-23 03:04

我来回答

2个回答

热心网友 时间:2024-12-05 15:40

这道题的主要算法是搜索,但当然还有解方程等其他方法,这里主要介绍搜索的方法。
深度搜索每个字母的值
显然O(n!)的复杂度会超时,那就必然要剪枝
下面来说一下优化
对于一个测试数据
5
ABCED
BDACE
EBBAA
一:剪枝:
如最后一列的D,E,A
如果D,E,A的值都已经搜出来一种方案了,那么A =(D+E) mod n 即D+E除以n的余数是A,因为D+E有可能〉n并且进位,所以要mod n,详细一点即,对于搜索出来的D,E,A如果上一位进位则 A=(D+E+1)mod n,不进位则A=(D+E)mod n,不知道是否进位则(A=(D+E+1)mod n)or( A=(D+E)mod n),如果满足这些条件则继续,否则退出。
如果只知道D,E则(D+E)mod n(如进位则是(D+E+1)mod n)这个数没被赋值到其他的字母上去就可以继续搜,同样只知道E,A和D,A也可以这样剪枝。
E,A:[A-E mod n] (进位则是 (A-E-1) mod n)没被赋给除D外的其它字母
D,A:[A-D mod n] (进位则是 (A-D-1) mod n)没被赋给除E外的其它字母
二:优化:
还有一个优化就是从搜索顺序的优化:搜索顺序的改变也成为大大提高程序效率的关键:从右往左,按照字母出现顺序搜索,有很大程度上提高了先剪掉废枝的情况。
三:注意:
进位情况要特别注意:
(1)
如果D,E,A都知道,那么(D+E)DIV n<>0则进位否则不进(上一位进位则(D+E+1)DIV n<>0 )
(2)
如果知道D,E那么(D+E)DIV n<>0则进位否则不进(上一位进位则(D+E+1)DIV n<>0 ) 特殊情况:如果上一位不确定是否进位那么又要分情况讨论:○1如果进位,不进位两种情况中只有一种情况合法(即所确定的数符合剪枝条件),那么就按这种情况确定是不是进位。○2如果两种情况都合法则,如果两种情况的进位是否都相同,那么可以确定这一位是否进位,不同的话则进位状态赋值为待定。
(3)
知道A,E那么 A<E则进位否则不进(上一位进位则(A-1)<E ) 特殊情况:同(2)。
(4)
知道A,D那么 D<E则进位否则不进(上一位进位则(A-1)<D ) 特殊情况:同(2)。
(5)
只知道D,E,A中一个的值,则进位状态待定。
附:
总结:
搜索解决这道题是最容易想到的,但普通的搜索显然会超时,所以剪枝非常重要。
剪枝的原则
1、正确性
枝条不是爱剪就能剪的。如果随便剪枝,把带有最优解的那一分支也剪掉了的话,剪枝也就失去了意义。所以,剪枝的前提是一定要保证不丢失正确的结果。 2、准确性 在保证了正确性的基础上,我们应该根据具体问题具体分析,采用合适的判断手段,使不包含最优解的枝条尽可能多的被剪去,以达到程序“最优化”的目的。可以说,剪枝的准确性,是衡量一个优化算法好坏的标准。 3、高效性 设计优化程序的根本目的,是要减少搜索的次数,使程序运行的时间减少。但为了使搜索次数尽可能的减少,我们又必须花工夫设计出一个准确性较高的优化算法,而当算法的准确性升高,其判断的次数必定增多,从而又导致耗时的增多,这便引出了矛盾。 因此,如何在优化与效率之间寻找一个平衡点,使得程序的时间复杂度尽可能降低,同样是非常重要的。倘若一个剪枝的判断效果非常好,但是它却需要耗费大量的时间来判断、比较,结果整个程序运行起来也跟没有优化过的没什么区别,这样就太得不偿失了。 综上所述,我们可以把剪枝优化的主要原则归结为六个字:正确、准确、高效。
还有搜索题除了要掌握一般的技巧,也要对每道题的内涵进行挖掘,找到其特性。对症下药才可有用。

热心网友 时间:2024-12-05 15:40

l,n,i,j,h,k:longint;
len:longint;
a,b:array[1..100] of longint;
begin
read(n);
a[1]:=1;
for i:=1 to n do
begin
k:=0;
for l:=1 to 100 do
begin
h:=a[l]*i+k;
a[l]:=h mod 10;
k:=h div 10;
end;
k:=0;
for l:=1 to 100 do
begin
h:=b[l]+a[l]+k;
b[l]:=h mod 10;
k:=h div 10;
end;
end;
len:=100;
while b[len]=0 do len:=len-1;
for j:=len downto 1 do
write(b[j]);
end.追问大哥,你丢个程序在这啥也不说,而且我看着似乎不对,你是不是来装牛的?我没的兜给你套着,下次别来装了.

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
注册保险代理有限公司需要什么资料! 现在什么云手机性价比高一点? 50个可接双宾语的动词 为琵琶独奏曲《春江花月夜》配一首词或诗 我经常看到HI语音里会有什么魅力榜、贡献榜这些排名,我也一直在语音直播... 跨行通怎么激活 父母是农民不知道有没有纳税 普通农民可以算纳税人吗? 农民不交农业税了,是不是纳税人? 小红书上女生缺衣服穿的心情说说四十句 电脑游戏编程算法优化问题 编程中的优化算法问题2 什么是简洁、清晰、逻辑严密的表达与书写 简洁有质感,什么是现代简约 衢州现在可以寄快递到山东潍坊吗? 山东潍坊今天能收快递吗? 山东潍坊什么时候通快递? 潍坊青州的快递还能收吗安全吗- 问一问 山东潍坊能收快递吗现在? 山东潍坊可以收派快递吗? oppo手机显示安全警告,网站安全证书已过期或不可信? 电信宽带到期不续费会怎样? c语言程序验证括号匹配问题在线等 C语言判断给定表达式的括号是否匹配 判断表达式中的括号是否正确配对.求教 编程实现检验括号是否匹配 ...验证一个字符串形式的表达式中的括号是否匹配,其中括号包括圆括号... 我不是太会用outlook软件!尤其是接收和发送邮件服务器栏怎么设置啊? 手机号被换了怎么解冻 被冻结,怎么才能解除,我换手机换了微信登陆解除就解不开?_百... 在拼多多上买东西怎样开发票- 问一问 微信双开后,红米note7总是默认双开的那个微信登录,登录不能选择... 怎么也改不了? 我的微信双开后,原来的就不能用了,怎么办? 微信双开后,王者荣耀总是默认双开的那个微信登录,登录不能选择... 我的怎么改不了 中二病也要谈恋爱中是第几集七宫说如果握住的不是硬币而是勇太的手 倍还可以换什么部首 [洛奇]治愈技能等级怎么升级 口袋妖怪漆黑魅影血翼飞龙逆鳞怎么学?新人求教,请高手讲解及方法_百 ... 飞龙逆鳞拳怎么按啊 口袋妖怪漆黑魅影血翼飞龙逆鳞怎么学 血翼飞龙的逆鳞问题 我的世界怪物大乱斗三头金翅飞龙的鳞片怎么用 AutoIt 与 AutoHotkey 有何异同?是选择前者还是后者 请会AutoIt和AutoHotKey的高手讲一讲AutoIt的长处 autohotkey autoit3 脚本相通吗 挨着中央空调的车间会不会凉快? 三块单相电表接三相电怎么接,度数怎么算- 问一问 手机号举报平台12321怎么举报一个电话号码