很笨的方法实现全排列
时间:2006-12-30
来源:互联网
有兴趣的看一下
PHP代码:
<?php
function full_sort($array){
$len = count($array);
for($i=0;$i<$len;$i++){
$a[] = 0;
$numr[] = $i;
}
for($a[$len-1]=0;$a[$len-1]<=$len;$a[$len-1]++){
if($a[0]==$len) break;
for($i=1;$i<$len;$i++){
if($a[$i]==$len){
$a[$i-1]++;
for($j=$i;$j<$len-1;$j++){
$a[$i]=0;
}
$a[$len-1]=-1;
$skip=true;
break;
}
}
if($skip){
$skip=false;
continue;
}
$pass =1;
foreach($numr as $num){
if(in_array($num,$a)){
$pass *= 1;
}else{
$pass *= 0;
}
}
if($pass){
$k++;
for($i=0;$i<$len;$i++){
$str.= $array[$a[$i]];
}
$str.= "<br>";
}
}
$str.=$k;
return $str;
}
$array = array("a","b","c","d","e","f");
echo full_sort($array);
?>
作者: muqiao 发布时间: 2006-12-30
PHP代码:
$array = array("a","b","c","d","e","f","g");set_time_limit(0);
$begin = explode(' ', microtime());
echo full_sort($array);
$end = explode(' ', microtime());
$time = ($end[0]+$end[1]) - ($begin[0]+$begin[1]);
echo '<br>';
echo "执行时间:{$time}秒";
执行时间:8.63643407822秒
作者: muqiao 发布时间: 2006-12-30
执行时间:0.389720201492秒
一个就差这么远啦?
作者: muqiao 发布时间: 2006-12-30
实际上至少循环了10^N N为字符个数
作者: muqiao 发布时间: 2006-12-30
//写个递归版本.
//9个以上会很慢, 内存占用狂增,本机测试:用时48秒左右, php.exe占用内存最高800M左右,注意:内存小者勿试
function fullSort($a,$count)
{
$result=array();
if($count==2){
$result[]=$a;
$result[]=array($a[1],$a[0]);
return $result;
}elseif($count==1){
return $a;
}
for($i=0;$i<$count;$i++){
$a0 =array_shift($a);
$ir = fullSort($a,$count-1);
foreach($ir as $r){
array_unshift($r,$a0);
$result[] = $r;
}
array_push($a,$a0);
}
return $result;
}
$a = array('a','b','c','d','e','f','g');
$bt = array_sum(explode(' ',microtime()));
$result = fullSort($a,count($a));
$et = array_sum(explode(' ',microtime()));
echo '用时:', $et-$bt, '秒';
foreach($result as $r)
{
echo "\n",implode('',$r);
}
?>
用时:0.186951160431秒
[[i] 本帖最后由 litqqs 于 2007-1-3 02:34 编辑 [/i]]
作者: litqqs 发布时间: 2007-01-03
php中的函数我知道的很少
array_shift()
array_unshift()
array_push()
我都不知道干什么的
在我机子上运行你的代码用时:0.231194972992秒
在你机子上试试这个
PHP代码:
<?php
function gosort($array,$len){
if($len<=2){
$rs_array[0]=$array[0].$array[1];
$rs_array[1]=$array[1].$array[0];
}else{
for($i=0;$i<$len;$i++){
$leave_one=$array[$i];
$k=0;
for($j=0;$j<$len;$j++){
if($j==$i){
continue;
}else{
$tosent[$k]= $array[$j];
$k++;
}
}
$fetch = gosort($tosent,$len-1);
foreach($fetch as $comein){
$rs_array[] = $leave_one.$comein;
}
}
}
return $rs_array;
}
//example
$array =array("a","b","c","d","e","f","g");
set_time_limit(0);
$begin = explode(' ', microtime());
$comeonbaby = gosort($array,7);
$f=0;
foreach($comeonbaby as $menu){
echo $menu."<br>";
$f++;
}
echo $f;
$end = explode(' ', microtime());
$time = ($end[0]+$end[1]) - ($begin[0]+$begin[1]);
echo '<br>';
echo "执行时间:{$time}秒";
?>
我研究这个是想用来计算行列式
我的这个方法虽然已经够快了,还是不行,10个以上字符我电脑CPU 99%被apache占了,好长一段时间都不出结果,
也不知道到底要用多长时间,总之计算不出来了,这种用来开发web的语言不适于用来计算这些东西
作者: muqiao 发布时间: 2007-01-03


作者: fengyun 发布时间: 2007-01-08
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28