您的位置:首页 > 其它

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

2016-05-24 10:57 155 查看
题目:

随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?

思路:关联型容器可以很方便解决,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() 函数用于对数组单元按照键名从高到低进行排序。

<?php
$idlist = array(1,1,2,2,3,3,4);  //id 列表

function validate($list)
{
$result=array();
foreach ($list as $v)
{
if(!isset($result[$v]))   //第一次出现 ,赋初始发帖数为1
{
$result[$v] = 1;
}else                     //再次出现 ,发帖数+1
{
$result[$v]++;
}
}
if(arsort($result))  //对每个id按发帖数降序排列
{
reset($result);
next($result);
next($result);
if(current($result) < (count($list)/4))  //确认三个小水王的发帖数都大于总帖数的1/4
{
die('ID list 非法!');
}
}
reset($result);
echo key($result) . '<br >';
next($result);
echo key($result) . '<br >';
next($result);
echo key($result) . '<br >';
}

validate($idlist);

?>


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

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

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

时间上应该慢一些
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: