一个PHP排序的问题,非常恼人,基本很少人能想出来,如能给出php算法,给足100分,先谢了

uyear 2014-05-26 11:47:24
一个PHP排序的问题,非常恼人,基本很少人能想出来,如能给出php算法,给足100分,先谢了

有一个Mysql数据表,行数为N结构如下,字段为C1,C2.,O1,O2:
C1 C2 O1 O2
0 a c 0 0
1 e a 0 0
2 a b 0 0
3 d c 0 0
4 g y 0 0
5 d t 0 0
6 b n 0 0
7 a r 0 0
8 y b 0 0

以上是一段数据样本,第一列是序号id,不用管,其实C1和C2是不止abcd这26个字母的可能性,有上百种可能性,都是杂乱分布在这两列中的,已知C1[$i]永远不会等于C2[$i],将以上数据读入php数组$a后,其中O1对应的是C1,O2对应的是C2,现在要做的是给O1和O2赋值,任何正整数均可,但要满足以下条件:
1.例如你想给第1行C1的a赋个值10,上面说了,C1对应是O1,那么 O1就是10 ,好,那所有一下出现的a都是10,$a[1]['C2']=‘a’那么$a[1]['O2']也会是10,$a[2]['C1']也是a,$a[2]['O1']也会是10,如此类推
2.重点来了,虽然你可以给随便赋值,但O1和O2赋值完成后,必须每一行的O2大于O1,这个就是难点

tips:经过我自己的算法赋值,最多只能做到大约有1-4%的行数实在不可能做到O2大于O1,假如哪位大神能做到100%,那就更好,不能的尽量控制在4%以下

求对$a 中O1和O2赋值过程(PHP代码)
这个问题很难,只要能帮助到我的就算不能解决问题,我也会给分谢谢了
...全文
555 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwk44 2014-05-28
  • 打赏
  • 举报
回复
我来给个方法 一开始全是0 所以不符合数是9 第一轮: 第0行 a=0 c=0 不符合 给a-1 c+1 第1行 给a+1 ... 计算下不符合数 比上一次大就结束 否则继续 这样的话 a c c a 这种循环型的估计永远是2了...
xuzuning 2014-05-28
  • 打赏
  • 举报
回复
很感兴趣的是楼主能做到只有 1-4% 不满足 希望能给出算法 随机产生 1000 组数据,你就会发现不满足的在 50% 弱
李睿_Lee 2014-05-28
  • 打赏
  • 举报
回复
数据是无规则的,又是已经给定的,那我觉得不能保证有多少成功率,只能尽可能高的成功率。
xuzuning 2014-05-27
  • 打赏
  • 举报
回复
充填失败的比例是由 C1、C2 列的分布决定的,既然两列的值已经存在,那么我们可以找出这些失败的行 至于需要控制失败的比例,那是不可能的,因为你不能去修改原始数据 找出失败的行的思路是:将 C1、C2 的值作为权,构造一个权重数组。并使 C2 的值在 C1 的前面 对于你示例的数据
$ar = array(
  array('C1' => 'a', 'C2' => 'c', 'O1' => 0, 'O2' => 0),
  array('C1' => 'e', 'C2' => 'a', 'O1' => 0, 'O2' => 0),
  array('C1' => 'a', 'C2' => 'b', 'O1' => 0, 'O2' => 0),
  array('C1' => 'd', 'C2' => 'c', 'O1' => 0, 'O2' => 0),
  array('C1' => 'g', 'C2' => 'y', 'O1' => 0, 'O2' => 0),
  array('C1' => 'd', 'C2' => 't', 'O1' => 0, 'O2' => 0),
  array('C1' => 'b', 'C2' => 'n', 'O1' => 0, 'O2' => 0),
  array('C1' => 'a', 'C2' => 'r', 'O1' => 0, 'O2' => 0),
  array('C1' => 'y', 'C2' => 'b', 'O1' => 0, 'O2' => 0),
);

$dict = array();
foreach($ar as $v) {
  if(! in_array($v['C2'], $dict)) $dict[] = $v['C2'];
  if(! in_array($v['C1'], $dict)) {
    $n = array_search($v['C2'],$dict);
    array_splice($dict, $n, 0, $v['C1']);
  }
}
$dict = array_flip($dict);

$e = array_filter($ar,
  function($r) use ($dict) {
    return $dict[$r['C2']] < $dict[$r['C1']];
  });

print_r($dict);
print_r($e);
权重数组
Array
(
    [e] => 0
    [a] => 1
    [d] => 2
    [c] => 3
    [b] => 4
    [g] => 5
    [y] => 6
    [t] => 7
    [n] => 8
    [r] => 9
)
失败的行
Array
(
    [8] => Array
        (
            [C1] => y
            [C2] => b
            [O1] => 0
            [O2] => 0
        )

)
cyagi 2014-05-27
  • 打赏
  • 举报
回复
引用 2 楼 cyagi 的回复:


$AK=array();
foreach ($a as $k=>$v)
{
	$index=array_search($v['C2'],$AK);
	$index2=array_search($v['C1'],$AK);

	if($index===false){
		$AK[]=$v['C2'];
	}
	if($index2===false){
		array_splice($AK,array_search($v['C2'],$AK),0, array($v['C1']));
	}

}
忽然想到修改了下这部分,发现可以完美结果,但算法应该还不是最优……

$AK=array();
foreach ($a as $k=>$v)
{
	$index2=array_search($v['C2'],$AK);
	if($index2===false){
		$AK[]=$v['C2'];
	}

	$index1=array_search($v['C1'],$AK);
	if($index1===false){
		array_splice($AK,$index2,0, array($v['C1']));
	}

	if($index1!==false || $index1!==false){
		foreach ($a as $k2=>$v2)
		{
			$index2=array_search($v2['C2'],$AK);
			$index1=array_search($v2['C1'],$AK);
			
			if($index1>$index2){
				unset($AK[$index1]); 
				array_splice($AK,$index2,0, array($v2['C1']));
			}
		}
	}
}

结果

C1   O1   O2   C2	
a	1	6	c	
e	0	1	a	
a	1	4	b	
d	5	6	c	
g	2	3	y	
d	5	7	t	
b	4	8	n	
a	1	9	r	
y	3	4	b	

0个错误 
cyagi 2014-05-27
  • 打赏
  • 举报
回复

<?php
$a = array(
  array('C1' => 'a', 'C2' => 'c', 'O1' => 0, 'O2' => 0),
  array('C1' => 'e', 'C2' => 'a', 'O1' => 0, 'O2' => 0),
  array('C1' => 'a', 'C2' => 'b', 'O1' => 0, 'O2' => 0),
  array('C1' => 'd', 'C2' => 'c', 'O1' => 0, 'O2' => 0),
  array('C1' => 'g', 'C2' => 'y', 'O1' => 0, 'O2' => 0),
  array('C1' => 'd', 'C2' => 't', 'O1' => 0, 'O2' => 0),
  array('C1' => 'b', 'C2' => 'n', 'O1' => 0, 'O2' => 0),
  array('C1' => 'a', 'C2' => 'r', 'O1' => 0, 'O2' => 0),
  array('C1' => 'y', 'C2' => 'b', 'O1' => 0, 'O2' => 0),
);

$AK=array();
foreach ($a as $k=>$v)
{
	$index=array_search($v['C2'],$AK);
	$index2=array_search($v['C1'],$AK);

	if($index===false){
		$AK[]=$v['C2'];
	}
	if($index2===false){
		array_splice($AK,array_search($v['C2'],$AK),0, array($v['C1']));
	}

}
//rsort($AK);

$err=0;
echo "<table>";
	echo "<tr>";
	echo "<th width='100'>C1</th>";
	echo "<th width='100'>O1</th>";
	echo "<th width='100'>O2</th>";
	echo "<th width='100'>C2</th>";
	echo "<th width='100'></th>";
	echo "</tr>";
	foreach ($a as $k=>$v)
	{
		echo "<tr>";
		echo "<td>".$v['C1']."</td>";

		$v['O1']=array_search($v['C1'],$AK);
		$v['O2']=array_search($v['C2'],$AK);

		echo "<td>".$v['O1']."</td>";
		echo "<td>".$v['O2']."</td>";

		echo "<td>".$v['C2']."</td>";

		if($v['O1']>$v['O2']){
			echo "<td>◆</td>";
			$err++;
		}else{
			echo "<td></td>";
		}
		echo "</tr>";


	}

echo "</table><br>";

echo $err."个错误";

?> 
结果是

C1   O1   O2   C2	
a	1	3	c	
e	0	1	a	
a	1	4	b	
d	2	3	c	
g	5	6	y	
d	2	7	t	
b	4	8	n	
a	1	9	r	
y	6	4	b	◆

1个错误 

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧