阿里巴巴笔试题 2013西安地区

nash01 2013-09-14 11:00:03
下面一个题目大家谈论下。我只有30分了。。。全部拿出来。

1.一个有10亿条记录的文本文件,已按照关键字排好序存储,
请设计算法以快速的从文件中查找关键字的记录。
2填空题(8分)
当存储数据量超出单节点数据管理能力的时候,可以采用的办法是数据库
sharding的解决方案,也就是按照一定的规律把数据分散存储在多个
数据管理节点N中(节点编号为0,1,2,,,,N-1)。
假设存储的数据时a 请完成为数据a计算存储节点的程序。

#define N 5
int hash(int element){
return element*2654435761;
}
int shardingIndex(int a){
int p = hash(a);
_________________________; //这里是空格
return p;
}


3.(6分)两个较长的单向链表a和b,为了找出及诶单noed满足node in a
并且node in b。请设计空间使用尽量小的算法(用c/c++,java 或者伪代码)

还有很多数学方面的题目 就不发了
...全文
2804 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
小敏纸 2013-09-24
  • 打赏
  • 举报
回复
第一题先分段,例如关键字mod 1000就可以分成1000段,由于是关键字排好序的,每段中进行二分查找应该就行了吧,肯定还有更好的方法吧
xj10921092 2013-09-21
  • 打赏
  • 举报
回复
p=p mod 2^32 p=element*2654435761 2^32=4294967296 2654435761 / 4294967296 = 0.618033987是一定值 完全扯淡。 结果应该是 p mod N
lumingming 2013-09-20
  • 打赏
  • 举报
回复
引用 4 楼 YiRan_FanPeiXi11 的回复:
第二题 http://hi.baidu.com/zymill/item/350cf75057f5ab9c8c12ed8f p=p mod 2^32
帅哥能解释一下吗?是一致性hash吗?那个N没什么用吗?
hustxiaoxian 2013-09-20
  • 打赏
  • 举报
回复
我觉得第二题是 p = p%(N); p = abs(p);
nash01 2013-09-18
  • 打赏
  • 举报
回复
第一题有个思路: 1.首先10亿个记录的文本很大,不可能直接放到内存中, 所以,我想可以将10亿个数平均分段,假设分为1000段,每段100万条记录。 2.将每段的起始结尾关键字数据记录到一个数组中。 3.然后用查找用的关键字,在上面的数组中数据比较。这样就能够得到这条关键字属于哪个段。 最后在这100万条记录中查找。
huoer_gf 2013-09-18
  • 打赏
  • 举报
回复
引用 15 楼 nash01 的回复:
第一题有个思路: 1.首先10亿个记录的文本很大,不可能直接放到内存中, 所以,我想可以将10亿个数平均分段,假设分为1000段,每段100万条记录。 2.将每段的起始结尾关键字数据记录到一个数组中。 3.然后用查找用的关键字,在上面的数组中数据比较。这样就能够得到这条关键字属于哪个段。 最后在这100万条记录中查找。
分块查找吧!我一面就跪了,哎。。。。
zyrobert 2013-09-17
  • 打赏
  • 举报
回复
引用 13 楼 peng_hao1988 的回复:
[quote=引用 12 楼 zyrobert 的回复:] 好多不会的 真不知道自己当时怎么找到工作的
从事互联网的公司对算法和性能看的比较重,多看看这方面的书很容易补起来的,编程主要领悟的是思想。[/quote] 多谢大哥指点 不知大哥都看哪方面的书呢?
huoer_gf 2013-09-16
  • 打赏
  • 举报
回复
请问楼主收到面试的通知了吗?
idonot 2013-09-16
  • 打赏
  • 举报
回复
感觉还蛮难的
依然_范佩西11 2013-09-16
  • 打赏
  • 举报
回复
引用 6 楼 wangyudong211 的回复:
没高手吗? 第二题hash用乘法散列后感觉要对N取余啊。
确实是对N取余
桃园闲人 2013-09-16
  • 打赏
  • 举报
回复
引用 12 楼 zyrobert 的回复:
好多不会的 真不知道自己当时怎么找到工作的
从事互联网的公司对算法和性能看的比较重,多看看这方面的书很容易补起来的,编程主要领悟的是思想。
zyrobert 2013-09-16
  • 打赏
  • 举报
回复
好多不会的 真不知道自己当时怎么找到工作的
nash01 2013-09-16
  • 打赏
  • 举报
回复
引用 10 楼 huoer_gf 的回复:
请问楼主收到面试的通知了吗?
还没通知,感觉打的不是很好。
依然_范佩西11 2013-09-15
  • 打赏
  • 举报
回复
第二题 http://hi.baidu.com/zymill/item/350cf75057f5ab9c8c12ed8f p=p mod 2^32
huoer_gf 2013-09-15
  • 打赏
  • 举报
回复
还有一题:五个人进行比赛,分组,或为蓝队,或为红队,求至少比赛多少场可以让任意两个人之间的比赛是红对蓝 和 蓝对红? 描述的不是很好,大致是这个意思,希望大家给个结果。
依然_范佩西11 2013-09-15
  • 打赏
  • 举报
回复
求题目啊,参考下
nash01 2013-09-15
  • 打赏
  • 举报
回复
第三题 一个比较好的答案。。 我们定义节点的距离为节点到链表开始所经过的节点数。如果两个链表长度相同,则相交节点其在两个链表上的距离一定相等。对于长度不同的两个链表,我们可以采用对齐的方式,使其向长度短的链表对齐。这样就可以应用上面的思路。具体算法如下:

struct node  
{  
    int v;  
    node *next;  
};  
/* 
返回链表的长度 
链表为空 返回0 
*/  
size_t listLen(node * p)  
{  
    size_t num = 0;  
    while (p!=NULL)  
    {  
        num++;  
        p = p->next;  
    }  
    return num;  
}  
// 如果找到了 则返回指针 指向公共节点  
// 如果不存在 则返回空指针  
node * findFirstCommenNode(node * pheada, node * pheadb)  
{  
    size_t lenA = listLen(pheada);  
    size_t lenB = listLen(pheadb);  
  
    node * plistA = pheada;  
    node * plistB = pheadb;  
    //调整长度  
    //plistA 指向较长的一个  
    if (lenA < lenB)  
    {  
        plistB = pheada;  
        plistA = pheadb;  
        size_t t = lenA;  
        lenA = lenB;  
        lenB = t;  
    }  
    while(lenA > lenB)  
    {  
        plistA = plistA->next;  
        --lenA;  
    }  
    //一样长了  
    //寻找公共节点  
    while (plistA!=NULL && plistA != plistB)  
    {  
        plistA = plistA->next;  
        plistB = plistB->next;  
    }  
    return plistA;  
}  
算法的空间复杂度O(1),时间复杂度O(m+n),效果不错吧。
nash01 2013-09-15
  • 打赏
  • 举报
回复
引用 2 楼 YiRan_FanPeiXi11 的回复:
求题目啊,参考下
笔试题 :http://snprintf.net/archives/592
小小浣熊 2013-09-15
  • 打赏
  • 举报
回复
没高手吗? 第二题hash用乘法散列后感觉要对N取余啊。
huoer_gf 2013-09-14
  • 打赏
  • 举报
回复
坐等答案!也是今天刚考完。

51,394

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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