百度PHPJSP职位在线笔试真题详解Word文档格式.docx
- 文档编号:16413152
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:8
- 大小:20.79KB
百度PHPJSP职位在线笔试真题详解Word文档格式.docx
《百度PHPJSP职位在线笔试真题详解Word文档格式.docx》由会员分享,可在线阅读,更多相关《百度PHPJSP职位在线笔试真题详解Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
图书别名是用户对某部图书自定义的名称。
在不同的分类中,相同的别名可能对应不同的书籍
4、一个数据文件,每条记录内容包括:
时间、IP地址、关键词。
记录是无序排列的,条数超过2000万条。
要求对该数据文件按检索词的顺序进行排序,并保持时间、IP地址和关键词的关联关系。
请设计一个程序,实现上述功能,并分析时间复杂度和空间复杂度。
运行程序所使用的服务器的内存为1G,硬盘足够大。
(至少要给出关键算法和设计思路)
第一题.专家解答
packageedu.ruc.ydl;
importjava.util.*;
publicclassRandomNumbers{
intfirstProbability;
intsecondProbability;
intthirdProbability;
publicvoidconfigProbability(intfirstProbability,intsecondProbability,intthirdProbability)//配置出现概率比
{
this.firstProbability=firstProbability;
this.secondProbability=secondProbability;
this.thirdProbability=thirdProbability;
}
publicintgetRandom()//随机输出录入的数字如(0,1,2)
Randomram=newRandom();
inttempRamdom=ram.nextInt(firstProbability+secondProbability+thirdProbability);
if(tempRamdom>
=0&
&
tempRamdom<
firstProbability)
return0;
elseif(tempRamdom>
=firstProbability&
secondProbability)
return1;
else
return2;
publicstaticvoidmain(String[]args)//main
RandomNumbersrandomNumbers=newRandomNumbers();
randomNumbers.configProbability(2,1,3);
System.out.println(randomNumbers.getRandom());
第二题.专家解答
表名:
Publish
字段名类型缺省值中文含义约束备注
idInt0编号PRI
titleVarchar(30)发布内容的标题
contentVarchar(50)发布的内容
timeVarchar(200)
dayVarchar(200)
dateVarchar(200)
pdoubleint01表示奇数,2表示偶数奇偶日
choiceInt0表示选择以上哪几种组合
Publish表由下列字段组成
Publish_id发布内容的唯一标识;
Publish_title发布内容的标题
Publish_content发布的内容
......其他与内容相关的字段
/*下列字段用于控制*/
Publish_time有效时间段,由时间型和|构成的字符串,默认为'
1975-1-112:
00:
00|3000-1-112:
00'
)
Publish_day(表示周几,int,2^0=1表示周一,2^1=2表示周二,2^2=4表示周三,......2^7=128表示星期天,0为默认),
Publish_date(表示日期,由1-31构成并用|分开的字符串,‘0’为默认,如2|5|15|31),
Publish_double(表选择奇偶日,int,1表示奇数,2表示偶数,0为默认)
Publish_choice(表示选择以上哪几种组合,int,2^0=1表示采用第一种控制,2^2表示采用第二种控制...)
设计思路:
1,要满足以上四个要求并能够让以上要求任意组合,可以选4个独立的表来存储不同的要求,也可以用4个字段来存储以上四个要求;
选择4个不同的表来控制,表中的数据满足数据原子性的要求,但如果这样,发布一条内容需要连接4个表来查询,查询效率低,所以我选择采取4个拼凑字段来进行控制;
这样的话,我们可以将数据字段和控制字段整合到一条记录中,查询数据的同时可以查询出控制字段,尽管这样需要在程序中分割字符串;
所以我采用(Publish_timePublish_dayPublish_datechoice)4个字段来表示,另外再采用Publish_choice表示选取哪种控制。
2,Publish_time采用时间型和|构成的字符串,如2002-1-110:
20|2002-1-112:
20|2007-2-208:
20|2007-2-212:
20.程序读取的时候先把该字符串用|分开到一个数组a,其中a[0]表示开始时间,a[1]表示a[0]的结束时间,其中a[2]表示开始时间,a[3]表示a[2]的结束时间......;
这样便可以满足一条内容在多个时间串内有效。
3,Publish_day为了提高效率,采用二进制位的方法控制,即2^0=1表示周一,2^1=2表示周二,2^2=4表示周三,......2^7=128表示星期天。
如果周一周二周三同时有效,则Publish_day=2^0+2^1+2^2=7,这样的设计比拼凑字符串效率要高,程序设计更简单。
4,Publish_date如果像Publish_day一样采用二进制位的方法控制,将达到2^31,数据太大,有些数据类型可能不支持,所以采用|分开的字符串,‘0’为默认,如2|5|15|31),程序读取采用|分开到一个数组,再操作数组。
5,Publish_double选择奇偶日情况只有两种,非奇即偶,用1表示奇数,2表示偶数
6,为了加强控制,另外再设一个字段Publish_choice表示采取上叙哪些控制的组合;
原理如3,都采用二进制位表示。
7,为了防止程序读取null的时候出错,对每个字段都采用了默认值。
第三题.专家解答
A数据库表设计
t_book(书籍表)
字段名
类型
缺省值
中文含义
约束
备注
id
Int
书籍编号
PRI
Name
Varchar(30)
书籍名称
Author
Varchar(20)
书籍作者
其他字段略,根据需要添加
t_user(用户表)
用户编号
用户姓名
t_user_sort(用户自定义分类表)
Id
分类编号
Auto_increment
分类名称
user_id
int
分类所属的用户ID
外键
t_mapping_sort_book(书籍分类匹配表)
Book_id
Sort_id
byname
书籍别名
B.相关SQL语句
用户A的所有分类
Selectt_user_sort.namefromt_user_sort,t_userwheret_user_sort.user_id=t_user.idandt_user.name=’A’
查出来一列,是用户A自己定义的分类名称
Selectt_book.namefromt_book,t_user_sort,t_mapping_sort_bookwheret_user_sort.id=t_mapping_sort_book.sort_idandt_user_sort.user_id=t_user.idandt_user.name=’A’andt_user_sort.name=’F’
说明:
按我们的设计,指定分类F就能查询其下书籍信息了,但是限制了用户A,可能A并没有建F,所以三个表连接查询,可以排除这个情况
C.问题分析:
用户数1亿,每个最多可建100个分类,考虑极端情况,表t_user_sort数据两将达到100亿,这个表参与连接查询,代价很高。
图书数10亿,表t_book数据两将达到10亿,这个表参与连接查询,代价也很高。
面临应用的特征分析:
一、1亿用户中,存在部分用户是活跃的,部分用户是不活跃的。
二、10亿图书中,存在部分图书是受欢迎的,部分图书是不受欢迎的。
三、把所有分类信息放在一个表中,这个集合自身意义并不大,我们更关心的某个用户拥有哪些分类。
四、书籍分类匹配表的设计,体现了关系数据库的特点,但实际应用中,我们关心的是特定分类下的图书信息及其别名
解决方案:
(一)数据库设计的改进
一、考虑用户增加分类时,需要在t_user_sort表查询用户已经建立了多少分类,代价较高,故考虑给t_user加上“sort_count”字段(分类数),用程序保证完整性,改进后,查询用户已经建立的分类数的代价降低了。
二、考虑某分类增加书籍时,需要在t_mapping_sort_book表查询该分类已经添加了多少书籍,代价较高,故考虑给t_user_sort加上“book_count”字段(书籍数),用程序保证完整性,改进后,查询分类已经添加的书籍数的代价降低了。
数据库改进的主要思路就是引入冗余,用空间换时间,可以再根据具体应用需求,做相应的冗余。
(二)系统设计的改进
针对上述“面临应用的特征分析”中的四条,做相应改进
一、针对用户的活跃状况,我们引入缓存机制,具体缓存方案是:
T_user一般不参加连接查询,如果需要其中的记录信息,根据主键查询,查询时即做缓存,下次有查询需求,先看缓存中有没有对应信息,如果有,则直接使用缓存中的信息,如果没有,则查询书库库,并做缓存。
注:
如果缓存量过大,可以考虑将缓存内容静态到外存中,对于缓存中的数据,也可以引入“长期不用则去除”的机制。
二、针对书籍的受欢迎程度状况,类似的,我们引入缓存机制,具体缓存方案是参照一。
三、把每个用户拥有的分类信息,静态化到外存中,比如采用xml文件,用户查询自己的分类时,只需读取外存中的信息就可以了。
需要程序保证外存和数据库信息的一致性。
四、类似的,解决方案参看三。
第四题.专家解答
分析:
这是一个典型的外部排序问题。
因为我们要排序的数量达2000万条,在内存只有1G的情况下,无法进行内部排序。
首先,将2000万条记录分成1000个子文件存储在硬盘上(硬盘足够大)。
然后,根据可用内存的大小,将自文件依次读入内存并利用有效的内部排序方法(冒泡法)根据检索词对它们进行排序,并将排序后的有序子文件重新写入外存。
---这一步得到1000个有序的子文件。
最后,根据内存,进行k-路平衡归并,最终得到一个有的文件。
算法:
voidkwaymerge(Element*r){
r=newElement[k];
//创建对象数组
int*key=newint[k+1];
//创建外结点数组
int*loser=newint[k];
//创建败者树数组
for(inti=0;
i<
k;
i++)
//传送参选关键码
{InputRecord(r[i]);
key[i]=r[i].key;
}
for(i=0;
i++)loser[i]=k;
key[k]=-MaxNum;
//初始化
for(i=k-1;
i;
i--)
//调整形成败者树
adjust(key,loser,k,i);
while(key[loser[0]]!
=MaxNum){
//选归并段
q=loser[0];
//最小对象的段号
OutputRecord(r[q]);
//输出
InputRecord(r[q]);
//从该段补入对象
key[q]=r[q].key;
adjust(key,loser,k,q);
//调整
Outputendofrunmarker;
//输出段结束标志
delete[]r;
delete[]key;
delete[]loser;
}
//自某叶结点key[q]到败者树根结点的调整算法
voidadjust(intkey[];
intloser[];
constintk;
constintq){
//q指示败者树的某外结点key[q],从该结点起到根
//结点进行比较,将最小key对象所在归并段的段
//号记入loser[0]。
k是外结点key[0..k-1]的个数。
for(intt=(k+q)/2;
t>
0;
t/=2)
//t是q的双亲
if(key[loser[t]]<
key[q]){//败者记入loser[t],胜者记入q
inttemp=q;
q=loser[t];
loser[t]=temp;
}
//q与loser[t]交换
loser[0]=q;
时间复杂度:
冒泡法---O(n^2);
k-路平衡归并---O(n*log2*1000);
整个算法---O(n^3log2*1000)
空间复杂度:
S(n^2)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 百度 PHPJSP 职位 在线 笔试 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)