百度研发笔试题(栈、算法)
1)设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)。
2)一串首尾相连的珠子(m个),有N种颜色(N<=10),
设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。
并分析时间复杂度与空间复杂度。
3)设计一个系统处理词语搭配问题,比如说 中国 和人民可以搭配,
则中国人民 人民中国都有效。要求:
*系统每秒的查询数量可能上千次;
*词语的数量级为10W;
*每个词至多可以与1W个词搭配
当用户输入中国人民的时候,要求返回与这个搭配词组相关的信息
1)参考min函数栈
2)和找最短字符串使之包含字符集中所有字符有点类似。
bool GetMinlen(int *a,int m,int &shortHead,int & shortlen)
{
int start=0,end = 0;
int countColor = 0;
int *colorArray = new int[N];
shortlen = m;
shortHead = 0;
for(int i =0;i< N;i++)
{
colorArray[i] = 0;
}
while(start < m)
{
//向后搜索直至所有的颜色均出现
while(countColor < N)
{
if(colorArray[a[end]]++ == 0)
{
countColor++;
}
if(countColor <N)
{
if((end+1)%m!=start)
end=(end+1)%m;
else
break;
}
}
if(countColor != N)
{
cout << "珠子颜色数少于所要找的数目"<<endl;
return false;
}
//start向后移动,直到有一个颜色数为0
while(start<m)
{
if(colorArray[a[start]] > 1)
{
colorArray[a[start]]--;
start++;
}
else
{
break;
}
}
if(shortlen > ((end<start?(end+m):end) - start +1) )
{
shortlen = (end<start?(end+m):end) -start +1;
shortHead = start;
}
if(start<m)
{
colorArray[a[start]]--;
start++;
countColor--;
end = (end+1)%m;
}
}
return true;
}
#define N 3
int main()
{
int start,len;
int m[] ={1,0,1,1,1,1,1,1,1,1,2};
bool answer = GetMinlen(m,11,start,len);
if(answer==true)
cout << "包含所有颜色的最短串 起点是" <<start<<" 长度是"<<len<< endl ;
return 0;
}
3)转自http://blog.csdn.net/v_july_v/article/details/6126444
可以建立一个RDF文件,利用protege 4.0。或者自己写的RDF/XML接口也行。在其中建立两个“描述对象”一个是国家,一个是人民。 国家之下建立一个中国,人民。并且在关系中建立一个关系:对每个存在的国家,都have人民。这样,每当用户输入这两个词的时候,就利用语义框架/接口来判断一下这两个词汇的关系,返回一个值即可。
--贝叶斯分类--
其实贝叶斯分类更实用一些。 可以用模式识别的贝叶斯算法,写一个类并且建立一个词汇-模式的表。
这个表中每个模式,也就是每个词汇都设一个域,可以叫做most-fitted word,
然后对这个分类器进行训练。这个训练可以在初期设定一些关联词汇;也可以在用户每次正确输入查询的时候来训练。通过训练,每个单词对应出现概率最高的单词设到最适合域里面。然后对于每个词,都返回最适合的单词。