php 从N个数中找出最大的10个数示例

前端之家收集整理的这篇文章主要介绍了php 从N个数中找出最大的10个数示例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
PHP从N个数中找出最大的10个数代码感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!
PHP从N个数中找出最大的10个数代码
题目:
从N个数中选取最大的前10个,有序输出.
N最大可能达到1000亿
每个数范围是0 - 2147483647

/**
 * PHP从N个数中找出最大的10个数代码
 *
 * @param 
 * @arrange 网: www.512Pic.com
 **/
define('DEBUG',FALSE);
define('INFO',TRUE);
$stderr = fopen('PHP://stderr','w+');
$stdout = fopen('PHP://stdout','w+');
$stdin = fopen('PHP://stdin','r+');
class PQueue {
 public $data;
 public $next = NULL;
 public function __construct($data) {
  $this->data = $data;
 }
 public static function factory($data,$n) {
  $i  = -1;
  $head = NULL;
  $prev = NULL;
  while ( ++ $i < $n ) {
   $node = new PQueue($data);
   if ( is_null($head) ) 
	$head  = $node;
   if ( !is_null($prev) )
	$prev->next = $node;
   $prev = $node;
  }
  return $head;
 }
 public static function dump($node,$n) {
  global $stderr,$stdout;
  while ( !is_null($node) ) {
   fprintf($n ? $stderr : $stdout,"%d\n",$node->data);
   $node = $node->next;
  }
  if ( $n ) fprintf($n ? $stderr : $stdout,"\n");
 }
}
function generate_test_data($n) {
 global $stderr,$stdout;
 srand(time());
 for ( $i = 0; $i < $n; $i ++ ) {
  $r = rand(0,2147483647);
  fprintf($stdout,$r);
  fprintf($stderr,"%s",pack('l',$r));
 }
}
function main($argc,$argv) {
 global $stderr,$stdout,$stdin;
 if ( $argc < 2 ) {
  printf("usage: \n\t1. 生成测试数据: %s <number> /* 标准错误以二进制方式输出测试数据,标准输出以文本方式输出测试数据用于脚本校验 */\n\t2. 执行Top 10查找: %s <exec> /* 标准输出输出前10个最大数据(倒序),开启INFO时在标准错误输出统计信息,开启DEBUG时在标准错误输出调试信息\n",$argv[0],$argv[0]);
  exit(0);
 }
 if ( strcmp($argv[1],"exec") != 0 ) {
  /* 不考虑数字输入的容错了 */
  generate_test_data($argv[1]);
  exit(0);
 }
 $sbuff = NULL;
 $rbuff = PQueue::factory(-1,10);
if ( DEBUG ) {
 PQueue::dump($rbuff,1);
}
if ( INFO ) {
 $s_0 = 0;
 $s_1 = 0;
 $s_2 = 0;
 $begin = microtime(TRUE);
}
 while ( FALSE != ($sbuff = fread($stdin,1024 * 1024 * 4)) ) {
  $sbuff = unpack('l*',$sbuff);
if ( INFO ) {
 $s_2 += count($sbuff);
}
  foreach ( $sbuff as $d ) {
if ( INFO ) {
 $s_0 ++;
}
if ( DEBUG )
 fprintf($stderr,"processing %d\n",$d);
   $tmp = &$rbuff;
   while ( $tmp != NULL && $d >= $tmp->data ) {
	$tmp = &$tmp->next;
if ( INFO ) {
 $s_0 += 2;
}
   }
if ( INFO ) {
 $s_0 ++;
}
   if ( $tmp === $rbuff )
	continue;
if ( DEBUG )
 fprintf($stderr,"tmp %d,rbuff %d\n",is_null($tmp) ? -1 : $tmp->data,$rbuff->data);
if ( INFO ) {
 $s_0 ++;
 $s_1 ++;
}
   $rbuff->data = $d;
   if ( $tmp != $rbuff->next ) {
	$t   = $rbuff;
	$rbuff  = $rbuff->next;
	$t->next = is_null($tmp) ? NULL : $tmp;
	$tmp  = $t;
if ( INFO ) {
 $s_1 += 4;
 $s_0 ++;
}
   }
  }
if ( DEBUG ) 
 PQueue::dump($rbuff,1);
 }
if ( INFO ) {
 $end = microtime(TRUE);
}
 PQueue::dump($rbuff,0);
if ( INFO ) {
 fprintf($stderr,"总计[%d]个输入\n总计比较[%d]次\n总计写内存[%d]次\n总计耗时[%0.6fs]\n",$s_2,$s_0,$s_1,$end - $begin);
}
}
main($argc,$argv);
/***   来自编程之家 jb51.cc(jb51.cc)   ***/

猜你在找的PHP相关文章