版权声明:最短的时间最核心的知识,有疑问,欢迎进行留言。 https://blog.csdn.net/lizhidefengzi/article/details/76946383
1.模拟实现C库的memcpy和memmove。
void* myMemcpy(void* dst,const void* src,size_t size)
{
assert(src);
assert(dst);
char* _dst = (char*)dst;
char* _src = (char*)src;
while (size--)
{
*_dst++ = *_src++;
}
return dst;
}
//支持重复拷贝
void* MyMemmove(void* dst, void* src, size_t size)
{
assert(dst);
assert(src);
char* _dst = (char*)dst;
char* _src = (char*)src;
//两种情况: 前后关系
if ( _src>=_dst||_src+size<_dst)
{
while (size--)
{
*_dst++ = *_src++;
}
}
else
{
_dst = _dst + size-1;
_src = _src + size - 1;
while (size--)
{
*_dst-- = *_src--;
}
}
}
2.【附加题】–给两个文件,分别有100亿个URL,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法。(设计出解决方案)
大数据问题:
常用两种方法:
1.hash切割
2.hash映射
hash 切割对于数字类都是求模分割到一个合适的内存大小,
进行一般的排序、交集、并集、补集,出现次数最多的。
排序类: 先对每个文件内部进行排序,然后拿出所有文件描述符的,每次取最小的(直至所有文件的数据都取到),存放到另一个文件。这样就实现了整体排序。
交集:经过hash切割以后,相同的数字都被分割到同一个文件。
交集就是出现次数比如对于a0 vs b0,我们可以遍历a0,将其中的url存储到hash_map当中。然后遍历b0,如果url在hash_map中,则说明此url在a和b中同时存在,保存到文件中即可。
如果分成的小文件不均匀,导致有些小文件太大(比如大于2G),可以考虑将这些太大的小文件再按类似的方法分成小小文件即可
近似算法:我们应该要想到BloomFilter, 它的大小大约500M 有 42亿个比特位 , 若要求1G的内存大约可以占 85亿多比特位。
对于求交集,我们可以遍历a0,将其中的url存储到hash_map当中。然后遍历b0,如果url在hash_map中,则说明此url在a和b中同时存在,保存到文件中即可。