软件工程课堂练习找水王s

Posted _Just

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件工程课堂练习找水王s相关的知识,希望对你有一定的参考价值。

题目:发现,“超级水王”没有了。统-计结-果表-明,有3个发帖很多的ID,他们的 数目都超过了 总数目N的1/4。你能从 ID列表中快速找出他们的ID吗?

 

思路:关联型容器可以很方便解决,php里的array就是关联型数组,php有很多方便的排序函数,所以本次用php实现。

首先对id列表进行遍历,以id为键值对数组$result进行赋值,

如果$result[$id]没有初始化,那么这就是第一次出现,即$result[$id]=1

如果$result[$id]已经初始化,那个发帖数加1,即$result[$id]++

 

最后最$result数组的值降序排序,取出前三个元素就是三个小水王。

 

先开始用的sort,未发觉键名都改了,然后看了一下手册:

Note: 此函数为 array 中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序。

此处介绍一下php的排序函数:

  sort() 函数用于对数组单元从低到高进行排序。
  rsort() 函数用于对数组单元从高到低进行排序。
  asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
  arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
  ksort() 函数用于对数组单元按照键名从低到高进行排序。
  krsort() 函数用于对数组单元按照键名从高到低进行排序。

 

 

 1 <?php
 2 $idlist = array(1,1,2,2,3,3,4);  //id 列表
 3 
 4 function validate($list)
 5 {
 6     $result=array();
 7     foreach ($list as $v)
 8     {
 9         if(!isset($result[$v]))   //第一次出现 ,赋初始发帖数为1
10         {
11             $result[$v] = 1;
12         }else                     //再次出现 ,发帖数+1
13         {
14             $result[$v]++;
15         }
16     }
17     if(arsort($result))  //对每个id按发帖数降序排列
18     {
19         reset($result);
20         next($result);
21         next($result);
22         if(current($result) < (count($list)/4))  //确认三个小水王的发帖数都大于总帖数的1/4
23         {
24             die(‘ID list 非法!‘);
25         }
26     }
27     reset($result);
28     echo key($result) . ‘<br >‘;
29     next($result);
30     echo key($result) . ‘<br >‘;
31     next($result);
32     echo key($result) . ‘<br >‘;
33 }
34 
35 validate($idlist);
36 
37 ?>

 

第一次插入新键时时间复杂度是O(n)

查找时时间复杂度是O(1)

排序用的是快排 O(nlogn)~(n^s)  1<s<2

 

时间上应该慢一些

 

以上是关于软件工程课堂练习找水王s的主要内容,如果未能解决你的问题,请参考以下文章

课堂练习--找水王

课堂练习找水王02

课堂练习--“找水王续"

课堂练习-找水王

课堂练习-找水王

课堂练习-找水王