很笨的方法计算行列式的值
时间:2006-12-30
来源:互联网
两个核心函数分别是
计算逆序数
全排列函数
哪位高人帮我把这两个核心函数改改(主要是full_sort函数,效率太低了),
整个运算会加快,也会减少限制
计算公式是
$p的属于1,2,3。。。。n全排列中的一个
所有可能的$p代入下式
array[0][$p[0]]×array[1][$p[1]]×array[2][$p[2]]×.......×array[n-1][$p[n-1]]
再乘上(-1)^$P的逆序数
然后把所有的加起来
结果得出#
举个列子
行列式:
1 2 3
4 5 6
7 8 9
所有可能的
$p=array(0,1,2);逆序数为0
$p=array(1,0,2);逆序数为1
$p=array(1,2,0);逆序数为2
$p=array(2,0,1);逆序数为2
$p=array(2,1,0);逆序数为3
$p=array(0,2,1);逆序数为1
则有
array[0][0]×array[1][1]×array[2][2]×(-1)^0
+
array[0][1]×array[1][0]×array[2][2]×(-1)^1
+
array[0][1]×array[1][2]×array[2][0]×(-1)^2
+
array[0][2]×array[1][0]×array[2][1]×(-1)^2
+
array[0][2]×array[1][1]×array[2][0]×(-1)^3
+
array[0][0]×array[1][2]×array[2][1]×(-1)^1
=结果
计算逆序数
全排列函数
哪位高人帮我把这两个核心函数改改(主要是full_sort函数,效率太低了),
整个运算会加快,也会减少限制
计算公式是
$p的属于1,2,3。。。。n全排列中的一个
所有可能的$p代入下式
array[0][$p[0]]×array[1][$p[1]]×array[2][$p[2]]×.......×array[n-1][$p[n-1]]
再乘上(-1)^$P的逆序数
然后把所有的加起来
结果得出#
举个列子
行列式:
1 2 3
4 5 6
7 8 9
所有可能的
$p=array(0,1,2);逆序数为0
$p=array(1,0,2);逆序数为1
$p=array(1,2,0);逆序数为2
$p=array(2,0,1);逆序数为2
$p=array(2,1,0);逆序数为3
$p=array(0,2,1);逆序数为1
则有
array[0][0]×array[1][1]×array[2][2]×(-1)^0
+
array[0][1]×array[1][0]×array[2][2]×(-1)^1
+
array[0][1]×array[1][2]×array[2][0]×(-1)^2
+
array[0][2]×array[1][0]×array[2][1]×(-1)^2
+
array[0][2]×array[1][1]×array[2][0]×(-1)^3
+
array[0][0]×array[1][2]×array[2][1]×(-1)^1
=结果
复制PHP内容到剪贴板
<?php
function num_sort($array){//计算逆序数
$t = 0;
$length = strlen($array);
for($j=1;$j < $length;$j++){
for($i=0;$i<$length-$j;$i++){
if($array[$i]<$array[$i+1]){
$temp = $array[$i];
$array[$i] = $array[$i+1];
$array[$i+1] = $temp;
$t++;
}
}
}
return $t;
}
function calculate($array,$rank,$sort){
$result=pow(-1,num_sort($sort));
for($i=0;$i<$rank;$i++){
$result*= $array[$i][$sort[$i]];
}
return $result;
}
function full_sort($pullin,$level){//全排列函数 并计算
$len = $level;
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[$i] = $numr[$a[$i]];
}
$result += calculate($pullin,$level,$str);
}
}
return $result;
}
$n = 4;
$array[0][0] = 1; $array[0][1] = 1; $array[0][2] = 1; $array[0][3] = 1;
$array[1][0] = 1; $array[1][1] = 2; $array[1][2] = 4; $array[1][3] = 8;
$array[2][0] = 1; $array[2][1] = 3; $array[2][2] = 9; $array[2][3] = 27;
$array[3][0] = 1; $array[3][1] = 4; $array[3][2] = 16;$array[3][3] = 64;
set_time_limit(0);
$begin = explode(' ', microtime());
echo full_sort($array,4);
$end = explode(' ', microtime());
$time = ($end[0]+$end[1]) - ($begin[0]+$begin[1]);
echo '<br>';
echo "执行时间:{$time}秒";
?>
PHP代码:
<?php
function num_sort($array){//计算逆序数
$t = 0;
$length = strlen($array);
for($j=1;$j < $length;$j++){
for($i=0;$i<$length-$j;$i++){
if($array[$i]<$array[$i+1]){
$temp = $array[$i];
$array[$i] = $array[$i+1];
$array[$i+1] = $temp;
$t++;
}
}
}
return $t;
}
function calculate($array,$rank,$sort){
$result=pow(-1,num_sort($sort));
for($i=0;$i<$rank;$i++){
$result*= $array[$i][$sort[$i]];
}
return $result;
}
function full_sort($pullin,$level){//全排列函数 并计算
$len = $level;
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[$i] = $numr[$a[$i]];
}
$result += calculate($pullin,$level,$str);
}
}
return $result;
}
$n = 4;
$array[0][0] = 1; $array[0][1] = 1; $array[0][2] = 1; $array[0][3] = 1;
$array[1][0] = 1; $array[1][1] = 2; $array[1][2] = 4; $array[1][3] = 8;
$array[2][0] = 1; $array[2][1] = 3; $array[2][2] = 9; $array[2][3] = 27;
$array[3][0] = 1; $array[3][1] = 4; $array[3][2] = 16;$array[3][3] = 64;
set_time_limit(0);
$begin = explode(' ', microtime());
echo full_sort($array,4);
$end = explode(' ', microtime());
$time = ($end[0]+$end[1]) - ($begin[0]+$begin[1]);
echo '<br>';
echo "执行时间:{$time}秒";
?>
作者: muqiao 发布时间: 2006-12-30


顶下lz
作者: 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