1.编程:
用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。
2.
函数的功能是拷贝src所指的内存内容前n个字节
到dest所指的地址上。
3英文拼写纠错:
在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。假设已经有一个包
含了正确英文
4寻找热门查询:
搜索
的长度为1-255字节。假设目前有一千万个记录,
这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个
。一个查询串的重复度越高,说明查询它的用户越多,
也就是越热门。请你统计最热门的10个查询串,要求使用的
5集合合并:
给定一个字符串的集合,格式如:
{aaabbbccc},{bbbddd},{eeefff},{ggg},{dddhhh}
要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应
输出
{aaabbbcccdddhhh},{eeefff},{ggg}
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。
1
1题
char*revert(char*str)
{
intn=strlen(str);
inti=0;
charc;
for(i=0;i{
c=str;
str=str[n-i];
str[n-i]=c;
}
returnstr;
}
///
2题
void*memmove(void*dest,constvoid*src,size_tn)
{
assert((dest!=0)&&(src!=0));
char*temp=(char*)dest;
char*ss=(char*)src;
inti=0;
for(;i{
*temp =*ss ;
}
returntemp;
}
/
3题
(1)思路:
字典以字母键树组织,在用户输入同时匹配
(2)
流程:
每输入一个字母:
沿字典树向下一层,
a)若可以顺利下行,则继续至结束,给出结果;
b)若该处不能匹配,纠错处理,给出拼写建议,继续至a);
算法:
1.在字典中查找单词
字典采用27叉树组织,每个节点对应一个字母,查找就是一个字母
一个字母匹配.算法时间就是单词的长度k.
2.纠错算法
情况:当输入的最后一个字母不能匹配时就提示出错,简化出错处理,动态提示
可能处理方法:
(a)当前字母前缺少了一个字母:搜索树上两层到当前的匹配作为建议;
(b)当前字母拼写错误:当前字母的键盘相邻作为提示;(只是简单的描述,可
以有更多的)
根据分析字典特征和用户
复杂性分析:影响算法的效率主要是字典的实现与纠错处理
(a)
(3)改进
策略选择最是重要,可以采用统计学习的方法改进。
//
4题
(1)思路:
用哈希做
(2)
首先逐次读入查询串,算哈希值,保存在
哈希的设计是关键。
//
5题
(1)思路:先将集合按照大小排列后,优先考虑小的集合是否与大的集合有交集。有
就合并,如果小集合与所有其他集合都没有交集,则独立。独立的集合在下一轮的比
较中不用考虑。这样就可以尽量减少字符串的比较次数。当所有集合都独立的时候,
就终止。
(2)处理流程:
1.将集合按照大小排序,组成集合合并待处理列表
2.选择最小的集合,找出与之有交集的集合,
如果有,合并之;
如果无,则与其它集合是独立集合,从待处理列表中删除。
3.重复直到待处理列表为空
是否有此元素存在:
1>若存在,则将此小集合与大集合合并,并根据大小插入对应的位置。转3
。
2>若不存在,则在该集合中取下一个元素。如果无下一个元素,即所有元素
都不存在于其他集合。则表明此集合独立,从待处理集合列表中删除。并加入结果集
合列表。转3。
3。如果待处理集合列表不为空,转2。
如果待处理集合列表为空,成功退出,则结果集合列表就是最终的输出。
算法复杂度分析:
假设集合的个数为n,最大的集合元素为m
排序的时间复杂度可以达到n*log(n)
然后对于元素在其他集合中查找,最坏情况下为(n-1)*m
查找一个集合是否与其他集合有交集的最坏情况是m*m*(n-1)
合并的时间复杂度不会超过查找集合有交集的最坏情况。
所以最终最坏时间复杂度为O(m*m*n*n)
需要说明的是:此
于最坏情况的概率很小,而且排序后优先用最小集合作为判断是否独立的对象,优先
与最大的集合进行比较,这些都最大的回避了最坏情况。
(3)可能的改进:
首先可以实现将每个集合里面的字符串按照
合并的效率增高。
另外,可能采取恰当的