给出递归方程p(m, n) = p(m-1, n-1) + p(m-1, n)
。我必须计算p(m, n)
为1≤m,n≤10⁵。问题是,对于较大的m和n值,递归算法会导致超时,并且由于存储器需求巨大而无法进行存储。
如何解决这个问题?
基本情况:p(1, n) = 1
和p(n, 1) = n
答案 0 :(得分:2)
summing over a row of binomial coefficients中Pascal's triangle的 O(k)中的运行时复杂性解决方案:
function sumbincoef(n, k) {
var bincoef = 1, sum = 1;
for (var i = 1; i <= k; ++i) {
bincoef = bincoef * (n - i + 1) / i;
sum += bincoef;
}
return sum;
}
function p(m, n) {
return sumbincoef(m - 1, n);
}
console.log(p(10000000, 50)); // 3.287546666914557e+285
p(10000000, 50)
的上述结果是JavaScripts 3287546666914557308694953621332468056786361676360499868634585863380466725155646219866201991329567029752979948424340585220003362046032042304860695097308112596244670197867704848935084227060330672914092328758709997221191832805084217964476100165465190964311176563705979858704659291260737501
数据类型提供的Number
的最佳64位浮点表示。
如果您想要未截断的结果,可以使用BigNumber
或e提供的math.js
数据类型。 G。使用内置无限整数精度的语言,如python:
def sumbincoef(n, k):
bincoef = 1
sum = 1
for i in range(1, k + 1):
bincoef = bincoef * (n - i + 1) / i
sum += bincoef
return sum
def p(m, n):
return sumbincoef(m - 1, n)
p(100000, 100000)
的结果然后计算为:
499501046507192253972016382165016795490214569527090845885764636931572916232128674163743665666224825201582197222777927465009399830382808828145423567712374643759944481493683554662317521368655623963290013926562054436854280264361419508228434551342533796175895734852642882234840076241617273777162514639326040347888548587055111602148817560266538899844896255830993538589288797776086004066014760230897461462964781196048289893677907933376274789865657240312463013091897065254029134301576756708936981141749544317887903105230331818606529389766117248600540424318477070091792567992901780178701093645407778329030359323063448641989731092113378967481944667862379438097956882838120556251035435243523258969819935505460018196737280904530080668894928014843179927901238072446652352611143006568854797917865974294924820228619193758535112116631671844721164869093886657664347210896806265095393445180183164158075136306996707640203558595746195167093746769722794815064609862820885861677177237577618965544613409120122637787604735232109297193143281637211566604237111077574665750135887503211441310591127467480027872866748233924163459047594797788458725483661220887021642022794105456895268782338606998831089263252858492741728124375916119162515932275273605718496708399083908512756140648903259740314770266957732873997064874959517425377216820725281582869800334669121365821701979006064013049210612375710391735611241570515203430185982008092787082821973612673247262485015725494504658113447637221435273821273612658375726059111572769418715411632110031651256876656468258217086260312807765589736930957145238072282746356420908759176566352648774768528071911978661396983651505303872842423871391609767461399191821808188237148477295333618456206816296606166782156794723260955094106191487045395819301161772547969438336820161478899695057607722400181860753455779555599800076529455386471051611521213101784674660802646378481292922291117729732263846155409865290314016325836822467188086620487667116664486514147958678463650664321165587980261524758583851658185476112847623020107169382759882200826407401117416594054877971098023823969426009927050867449297425550273462330861707156765496920296163447679326944348721350430351431775104278101477467624002539826078245984163255337205048391147597708080885877149876000494365368893810534294538548470580521901431197522266189479593538014463019674491305038744383642645905323424457194682453239229560580609665035395026852952109400642827970184953544401648343580582798061616599915546161254143309016094021972378649338104846790989219296398462506166346759734660386216776368278312411189391694403749963841581672015930223180935189489215651642191173520547215329573596417059548759261960616383719249528078184421646951972100130876548842530256646855072454319807081027802677366778496335047068763591457120361713396878253488278373796705065511267141504020453979366477210677565365102508579921211538023460486645364507080317698044027960117868844282392612004638855574456724620849780358589314921826698909043473705337555567676185577021829965544484874282940044393098746717896462310202588362300612530920200598314493633690153524918060898724233955037392317809733241461236806705756778358964589098402802686324207056417392912062956097730059220620467489148165852100126520933084748115936793032624270511110593477211189414459485604025728757068098240268486158228528249923976882858727406429870303866957938766617760780471795963759967550711112348150850685870966875245964768164755055764647591814140959591082583822797325791402449212805837407518390263393933135849982464847468852289743807331405546499101036850666516222550269268927559440173707409933255728966134245049650011836808427764708672102996268598262249896274157967185317198518590480573516153709349251752736114451358742516668416415014056645542084657522869496659196729664649747139800765487805935445946476422453712164238350312158558581136588330339805098390110228229450794976235237050057905548181686566469417843447470437966708845469390319929232365029446408799942223874306503157653438003504241863376389488867841502138945138605284191651073513986429766816605528203213195486228997484308145400980207087696788443829399621427495607586896213517162432420712372841944477094662072549375287970150662484877084847766514844010965243708175054896001810511938413758818499048880748981804835217407006206534178843995249871829814824785272976236769100018188516244749105166566645678115758492720520765852709696411736169942422677608660184404415605047197071746914110177482514076537554354930234061240148691281562249466598264810118630429325452515399665432600061583595759138287104784475656809204770606073689315552144885893072407915848292438347477741312625248061352235735611481013734118145490193873468849367947106272089617764919373991522512695489436673486630154877207823740273686636638362432637951749766817706347695022942749434178746393230762602040024505739294614454272167699849739043373580675989291928572821079158559650205899472039513417317877516994404336256394178864881324960691371828699646365111939628846211639274360064862769303598415189124153186294990424231925191417812920195865593634719073227682584503126501160879567154237760795073764957460764847218118345541661684688399656910463793501212311916560911835761838604920859385193008615426122402158816680137986658060063112416154266464449307727961071368925370548941112236475633178611278358488970488367077150864463416631753872560508393456066723284036989868635573095964996905908941377071089646344189514271545497122063025597292461895498316477513193285055744207113308148490503682635546425228973543075404702728889893215075244997931708235026411028139300443201285471622212702201712157010190603742876899950803323276049349039529467366012152531795368191076064030002091376466274262396395211786379928710477731618191546621412535575940088781686990576188099734313163527531754992562716693779730077045043100714681283686916584654116442716350074373831755941544258688763440976318008267295027808038385672680882772548721248953803195304665001420848242379701352333473424329681821271431262082241832608696129326423712247618165115265570672466616991116827580571573456595008524411341826295819986195631330807010285399836369176479873956274448070964363062987878085079632291177057596108862695982551717239684018452850190652827893315550573815659478577816825936387899595443144538274747600973746107442570853962617619714690085057474261950292217916487438463997079319232043863295087455246661942673271498962695028065578114412057359607906860506013369982431141580521514363436992016757106014975830542309658234403797226348262428503527722607627374672521742645899375609298682359523075770679129106952008605914785116376851369489389675345202246927679382525177857793643660079844253066557273855078784968772054874668705799559955748136340085901947545390152059220003779273428048848283479216281364166370820902229536392234002568038707714420635622817669181273453446821545103410837522990966087225668145692699157728030522984630225439385015209228957673914586288140531636105401791303045228623030960211879018157360007937453768081689262173114938495894390433572696442328620861175244388340193472673729441595379867764640035462073568534832351476535025354154570624638570238809672950365760311681711306406853725208126023672479870783944100192272338719447518959617229708562275511586949751517421096854404166485455408828050535434657901034753......(Stackoverflow wouldn't accept that many figures)......35584033065631459417382400319827381172596270290200128863975429530908663000094178338788124817542256133205278775822567235131041742740388086850961813203192415685921043738611547233989330610824844921161394624381302583949343237869506130180533962330864195008133672029951612013268171775150776491632259932940651971293308867493640115946272139008056659177138051629001196971303929378474742559650357926964921581983787765676242110637407432013648653577728554711716235928485261817836143275758132836194624040329639724476539354076803333370657299130399405639377328156503892871742094805404749559718018780537663179707071738441247346265393895346637645447954972532636035989709841370920409915283748844043118230409672811818851233907536566733098961559969558597989676416558748410250288649969283238492130407759470433388160427741579918094425224169955675752566454851995044459531566687902047443477947732956324052267310715147866687996449479664832222343450324337265830939410648597073095957066489336687641851497595353089962089070124678142503268136885818177784860001623498065332641225847583636580915696933779395639132466879020005529605686135419561759229854553740334926348040454590936489250787032272274132235539316693299556594405068873159492248372994505770167129657673870041055367409235760626687253635769065524148306489540738831634895697285178695268711384889816905784198111604201298512577652367194941554688
答案 1 :(得分:0)
您可以通过提供更多知识来帮助算法。在下面的工作示例中,我添加了一些使算法更快的元素。您当然可以添加其他知识或概括现有知识。 请注意,生成的数字非常大。
def p(m,n):
# p(1,n)=1
if m == 1:
return 1
# p(m,1)=m
if n == 1:
return m
# ===== START KNOWLEDGE ======
# p(n,m)=pow(2,m-1) if n>m-1
if n > m-1:
return pow(2,m-1)
# p(n,m)=pow(2,m-2)-1 if n-m >2
if n-m > 2:
return pow(2,m-2)-1
# p(n,m)=pow(2,m-1)-1 if abs(n-m)==2
if abs(n-m) == 2:
return pow(2,m-1)-1
# p(n,m)=pow(2,m-1) if m-n=1
if m-n==1:
return pow(2, m-1)
# p(n,m)=pow(2,m-1)-m if m-n==3
if m-n == 3:
return pow(2,m-1)-m
# p(n,m)=pow(2,n*2) if (n+1)*2==m
if (n+1)*2 == m:
return pow(2, n*2)
# ===== END KNOWLEDGE ======
# general case
return p(m-1, n-1)+p(m-1, n)
答案 2 :(得分:0)
你也可以使用一维数组。您不必保存所有结果。
如果开始填充一维数组,则m等于零。 在下一步中,您将计算m = 1的行并将其保存到m = 0 arrayplace中。对于下一级别,您不需要m-1以下的结果,因此您可以替换它们。你只需要记住你做了多少次迭代。