Detailed explanation of PHP lost handkerchief problem example
Problem description: There are n people in a circle, and then starting from an arbitrarily designated person, taking m people as the unit, m people are killed every time the m person is killed. Ask for someone who will not be killed in the end.
Left issues:
Use PHP for simple implementation. PHP has a depth limit of 100 times for recursion, so there is no need for recursion here, use loops; handle it in PHP There are many functions in arrays, so sequential tables (arrays) are used. Deleting elements in sequential tables is more complicated, so the efficiency is relatively low, and it can only process less than 10,000 data. The traversal in the linked list is more complicated and will also lead to low efficiency. The combination of the sequence list and the linked list will be done later.
Simulation implementation:
class Dhc { private function dropHandkerchief($start=0,$distance,$menArray) { $count = count($menArray); $pos = $distance - 1; $start = $start > ($count-1) ? 0 : $start;//开始位置大于总人数则默认从第一个开始 $pos = $start + $pos;//第一个要被出列的人的位置,pos为下标,所以要 -1; while($count > 1) { if($pos < $count)//判断要出列的人的位置是否超出数组大小,超出则减去(或取模)数组大小,从头开始 { echo "第". $menArray[$pos] ."人出列<br />"; array_splice($menArray,$pos,1);//删除要出列的人 $count = count($menArray);//重新计算大小 $pos += $distance - 1;//下一个要出列的人的位置,pos 为要数的第一个人,所以第 n 个人的下标为 pos + n -1 }else { //$pos -= $count; $pos = $pos % $count; } } echo '<br />'; echo "第" .$menArray[0]. "人被留下"; } public function drop() { $menArray = array();// $total = 100;//总人数 $distance = 50;//间隔人数 $start = 3;//从第几个人开始 $i = 0; while($i < $total)//初始化 { $menArray[$i] = $i + 1; $i++; } $this->dropHandkerchief($start, $distance, $menArray); } }
Mathematical derivation implementation: (20170914)
Simply change the description of the problem: there are n Individuals are numbered 0 - n-1. Count from 0. When m is reached, m will die. The next person will continue counting from 0 until there is only the last person left. Find the initial number of this person.
Start over every time someone dies, which is equivalent to reducing the scale of the problem, that is, solving n-scale solutions: n, n-1, n-2, n-3... 3, 2 , 1.
If the number of the person who died in the second round (scale of n-1 people) is x (this number is re-arranged from 0 after the death of the first person), it can be deduced This person's number in the first round (when the number of people is n) is: (x + m)%n.
The number of the person who died in (n-2) is: (x + m)%(n-1)
(n-3) The number of the person who died in (n-1) is: (x + m)%(n-2)
(1) The number of the person who died in (2) is: (x + m )%2, at this time x = 0;
Reverse the above process, it is known that when the scale is 1, x = 0;
Find the value of x2 when the scale is 2: (x + m) % 2 = x2
Find the value of x3 when the scale is 3: (x2 + m) % 3 = x3
Find the value of x when the scale is n.
$n = 100; $m = 3; $s = 0; $x = 0; for ($i=2; $i<=$n; $i++) { $x = ($x + $m) % $i; } echo ($x + $s) % $n; // $s=0,表示从第 0 个开始数,如果不是从 0 开始,则只需要向后推 $s 个即可
The above is the detailed content of Detailed explanation of PHP lost handkerchief problem example. For more information, please follow other related articles on the PHP Chinese website!

ThesecrettokeepingaPHP-poweredwebsiterunningsmoothlyunderheavyloadinvolvesseveralkeystrategies:1)ImplementopcodecachingwithOPcachetoreducescriptexecutiontime,2)UsedatabasequerycachingwithRedistolessendatabaseload,3)LeverageCDNslikeCloudflareforservin

You should care about DependencyInjection(DI) because it makes your code clearer and easier to maintain. 1) DI makes it more modular by decoupling classes, 2) improves the convenience of testing and code flexibility, 3) Use DI containers to manage complex dependencies, but pay attention to performance impact and circular dependencies, 4) The best practice is to rely on abstract interfaces to achieve loose coupling.

Yes,optimizingaPHPapplicationispossibleandessential.1)ImplementcachingusingAPCutoreducedatabaseload.2)Optimizedatabaseswithindexing,efficientqueries,andconnectionpooling.3)Enhancecodewithbuilt-infunctions,avoidingglobalvariables,andusingopcodecaching

ThekeystrategiestosignificantlyboostPHPapplicationperformanceare:1)UseopcodecachinglikeOPcachetoreduceexecutiontime,2)Optimizedatabaseinteractionswithpreparedstatementsandproperindexing,3)ConfigurewebserverslikeNginxwithPHP-FPMforbetterperformance,4)

APHPDependencyInjectionContainerisatoolthatmanagesclassdependencies,enhancingcodemodularity,testability,andmaintainability.Itactsasacentralhubforcreatingandinjectingdependencies,thusreducingtightcouplingandeasingunittesting.

Select DependencyInjection (DI) for large applications, ServiceLocator is suitable for small projects or prototypes. 1) DI improves the testability and modularity of the code through constructor injection. 2) ServiceLocator obtains services through center registration, which is convenient but may lead to an increase in code coupling.

PHPapplicationscanbeoptimizedforspeedandefficiencyby:1)enablingopcacheinphp.ini,2)usingpreparedstatementswithPDOfordatabasequeries,3)replacingloopswitharray_filterandarray_mapfordataprocessing,4)configuringNginxasareverseproxy,5)implementingcachingwi

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

SublimeText3 Chinese version
Chinese version, very easy to use

WebStorm Mac version
Useful JavaScript development tools

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver Mac version
Visual web development tools
