实现memcpy和memmove以及大数据url交集。

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中同时存在,保存到文件中即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值