百度的笔试题,有两题不明,求讨论

每天看一遍,防止恋爱&&堕落 2012-10-15 02:34:59
加精
第一题:

给出a-z,0-9,输出所有的3个字符的组合

我是穷举出来的,n^3次方复杂度,很不好,大家讨论讨论能不能调优,网上说可以用递归,不知怎么解,如果不用递归又该怎么解?

第二题:

现在有100W条学生数据,格式如下:
姓名---------------描述
张三---------------爱好篮球
李四---------------爱好足球
王五---------------IT从业者,喜欢C++
姓名字段不超过4个汉字,描述字段不超过50个汉字,请实现一个查系统,要求如下:
1) 可以根据姓名快速查到描述信息
2) 可以根据描述信息(这里假设只通过一个字),比如“爱”,找到对应的姓名张三和李四
3) 不能利用现在的数据库系统

说说我的思路:姓名那个比较简单,用汉字的拼音进行索引归类来处理,但是描述信息我就悲剧了,还是这样处理显然不行,50*100W就是5000W,这得崩溃了,大家有没有啥想法
...全文
87986 291 打赏 收藏 转发到动态 举报
写回复
用AI写文章
291 条回复
切换为时间正序
请发表友善的回复…
发表回复
Koala_1 2014-03-04
  • 打赏
  • 举报
回复
正在学习中。。。
luoweifu 2014-03-02
  • 打赏
  • 举报
回复
说一下第二题的思路: 1.用一个Map来存放数据,姓名为key,描述为value,这样可以根据姓名来快速查找描述信息,解决第1个问题; 2.对map进行排序(根据字典序),输入关键词时就可以根据字典序快速索引,解决第2个问题。
yanleiberg 2014-03-01
  • 打赏
  • 举报
回复
额,287楼有个错误,空间计算可以用平均每汉字50个rowid, 但是实际存储要用list或者hashtable因为某一个单独汉字可能对应多于50条记录。
yanleiberg 2014-03-01
  • 打赏
  • 举报
回复
引用 85 楼 sjjwind 的回复:
每个汉字不都是两个字节的unicode码么,用这个来做索引(总共也就65536个,还有很多地方是用不到的),不需要用拼音,而且不准确,然后把目前所有的信息都单独存放起来,然后建立两个hash表,一个是查询姓名的,一个是查询关键字的,比如爱的unicode是xxx,那么在hash(xxx)的后面挂个指针域,指向这条描述,姓名也差不多的做法。
每条记录要预处理一下加个id,100万条用四Byte int足够了 实际占用空间: 64K个汉字 x 2Byte + 64K个汉字 x (平均每个字对应最多50个记录) x 4Byte RowId = 12928K = 13MB, 实际情况可以建立一个二维数组 int(65535, 51)即可,每行第一个记录是汉字unicode,后面50条是对应的rowid。 用数字的好处是查询很快,但空间利用效率不高,可以用hashtable 索引汉字unicode,后面的mapping rowid用list或者arraylist,不过最多也就用13MB而已,如果超出的话就还是用二维array比较好。
SmallBoat2000 2014-02-14
  • 打赏
  • 举报
回复
1、n=36,n的3次方才4万左右,穷举法完全没问题。 2、不能用现有的数据库系统就用hadoop吧。把数据存到hadoop系统中,用类sql的HQL查询: select 描述 from table where 姓名='XXX'; select 姓名 from table where 描述 like '%爱%'; (Hive建表语句: CREATE EXTERNAL TABLE IF NOT EXISTS _Table( 姓名 STRING, 描述 STRING, ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' STORED AS TEXTFILE LOCATION '/apps/hive/..../_Table' ; ) 企业需要的实战人才,相信我,这就是最佳的实战解决方案。
brk1985 2014-01-23
  • 打赏
  • 举报
回复
引用 48 楼 lucene456 的回复:
第2题 string nam[]=split(“姓名”); string discrption[]==split("爱好"); name[i].dis 对应 discption[i]; 创建索引文件 create_index[汉字]=(次数,value,location,name[]<->discrption[]) 查询索引文件 index.search("汉字"){ return (location ,value) }
思路是这样的,建索引,,,具体怎么编程还是有点摸不着头脑。。。
幸运小侯子 2014-01-21
  • 打赏
  • 举报
回复
一题穷举+1,字典毕竟一共就26*2+10个字符,二题不知,来挣积分
Eleve 2014-01-17
  • 打赏
  • 举报
回复
第一题我觉得因为组合很少,用哈希表应该是最快的
一起来玩玩呗 2013-12-26
  • 打赏
  • 举报
回复
第一次不就是n个字符中选取m个数的组合嘛.... 递归不重复的组合
#include <iostream>  
using namespace std;  
const int MAX = 10;  
int number[MAX], used[MAX], result[MAX];  
int n;  
  
void f(int l)  
{  
    if(l==n)  
    {  
        for(int i=0; i < n; i++)  
            cout << result[i] << ' ';  
        cout << endl;  
        return ;   
    }  
    for(int i=0; i < n; i++)  
    {  
        if(used[i]>0)  
        {  
            used[i]--;  
            result[l] = number[i];  
            f(l+1);  
            used[i]++;            
        }  
    }  
}  
  
void readData()  
{  
    int count=0, value;  
    cin >> n;  
    for(int i=0; i < n; i++)  
    {  
        cin >> value;  
        int j;  
        for(j=0; j < count;j ++)  
        {  
            if(number[j]==value)  
            {  
                used[j]++;  
                break;  
            }  
        }  
        if(j==count)  
        {  
            used[count]=1;  
            number[count++] = value;  
        }  
    }  
}  
  
int main()  
{  
    readData();  
    cout << "Result is :" << endl;  
    f(0);  
    return 0;  
}  
至于第二题,就是一对多和多对一的问题,索引,建立关键字等一些东西都可以提高效率
_IdleMind 2013-12-26
  • 打赏
  • 举报
回复
第一题:要列出所有排列,就是让你直接打印都是那个复杂度,所以没法优化了。递归和迭代,自己再学习一下吧。 第二题:正向索引可以考虑Hash表,第二问可以用倒排索引。
八哥 2013-12-26
  • 打赏
  • 举报
回复
离散一次就行了 比如 描 有0 述 有0 爱 有1,2 好 有1,2 ............... 这个建好后 查讯就简单多了 这是对每个字做离散处理 实际应用中 是对每个词做离散处理(比如 爱好 篮球 足球 IT 喜欢) 姓名---------------描述 张三---------------爱好篮球 李四---------------爱好足球 王五---------------IT从业者,喜欢C++
LAONINGA098 2012-11-08
  • 打赏
  • 举报
回复
很好哦....
kissoday 2012-11-08
  • 打赏
  • 举报
回复
引用 85 楼 sjjwind 的回复:
每个汉字不都是两个字节的unicode码么,用这个来做索引(总共也就65536个,还有很多地方是用不到的),不需要用拼音,而且不准确,然后把目前所有的信息都单独存放起来,然后建立两个hash表,一个是查询姓名的,一个是查询关键字的,比如爱的unicode是xxx,那么在hash(xxx)的后面挂个指针域,指向这条描述,姓名也差不多的做法。
正解。。。
a13774 2012-11-07
  • 打赏
  • 举报
回复
学习下 .....
xidike 2012-11-07
  • 打赏
  • 举报
回复
学习下 .都不错..
prototyper 2012-11-06
  • 打赏
  • 举报
回复
对应第一题,刚写了个算法,较为简洁但效率SO&SO,但取3位的组合还行:

Array.prototype.getCombination = function(m) {
     var arr = [], q = this, n = q.length;
     ~function(o, i, j, n, m) {
         if (m == 0) {
             arr.push(o.join(""));
             return 
         }
         for (; q[j]; j ++) { 
                o[i] = q[j];
                arguments.callee(o, i + 1, 0, n, m - 1);
         }
     }([], 0, 0, n, m);
     return arr
}
TEST:

<textarea id="show" style="width:500px;height:500px"></textarea>
<script type=text/javascript>
Array.prototype.getCombination = function(m) {
     var arr = [], q = this, n = q.length;
     ~function(o, i, j, n, m) {
         if (m == 0) {
             arr.push(o.join(""));
             return 
         }
         for (; q[j]; j ++) { 
                o[i] = q[j];
                arguments.callee(o, i + 1, 0, n, m - 1);
         }
     }([], 0, 0, n, m);
     return arr
}
document.getElementById("show").innerHTML = "0123456789abcdefghijklmnopqrstuvwxyz".split("").getCombination(3).join(",");
</script>
prototyper 2012-11-06
  • 打赏
  • 举报
回复
270#简化:

Array.prototype.getCombination = function(k) {
     var arr = [], q = this, n = q.length;
     ~function(o, i, j, k) {
         if (k == 0) {
             arr.push(o.join(""));
             return 
         }
         while (q[j]) { 
             o[i] = q[j], j ++;
             arguments.callee(o, i + 1, 0, k - 1);
         }
     }([], 0, 0, k);
     return arr
}
TEST:

<textarea id="show" style="width:600px;height:500px"></textarea>
<script type=text/javascript>
Array.prototype.getCombination = function(k) {
     var arr = [], q = this, n = q.length;
     ~function(o, i, j, k) {
         if (k == 0) {
             arr.push(o.join(""));
             return 
         }
         while (q[j]) { 
             o[i] = q[j], j ++;
             arguments.callee(o, i + 1, 0, k - 1);
         }
     }([], 0, 0, k);
     return arr
}
document.getElementById("show").innerHTML = "0123456789abcdefghijklmnopqrstuvwxyz".split("").getCombination(3).join(",");
</script>
cc_weige 2012-11-06
  • 打赏
  • 举报
回复
各种犀利 学习了
ws0308 2012-11-06
  • 打赏
  • 举报
回复
引用 257 楼 jak1986 的回复:
引用77楼 其实第一题就是一个36进制的算法 如果你用穷举便利说明比较传统 如果你把它看成36进制就快乐很多 最大值zzz 最小值000 C/C++ code123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555……
这个代码有bug,含有重复的,而有的却没有生成,比如010、110、a00等
ii_Forrest 2012-11-05
  • 打赏
  • 举报
回复
学习了,多向高人学习
加载更多回复(231)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧