day26之模拟实现memcpy和memmove函数

来源:互联网 发布:java程序员转正申请 编辑:程序博客网 时间:2024/05/21 10:28
  • 模拟实现memcpy函数
//方式一:一个字节一个字节拷贝void *mymemcpy(void *dest, const void*src, size_t n){    assert(dest && src && n > 0);    char *destbak = (char*)dest;    const char*srcbak = (const char*)src;    assert(destbak >= srcbak+n || destbak <= srcbak);  //断言内存不重叠    while(n--)    {        *destbak++ = *srcbak++;    }    return dest;}//方式二:优化拷贝void *mymemcpy2(void *dest, const void*src, size_t n){    assert(dest && src && n > 0);    assert((char*)dest >= (char*)src+n || (char*)dest <= (char*)src);  //断言内存不重叠    int num = n/sizeof(dest);  //cpu宽度去拷贝    int slice = n%sizeof(dest); //字节数    int *destbak = (int*)dest;    const int*srcbak = (const int*)src;    while(num--)    {        *destbak++ = *srcbak++;    }    while(slice--)    {        *((char*)destbak++) = *((char*)srcbak++ );    }    return dest;}
  • 模拟实现memmove函数
void *mymemmove(void *dest, const char*src, size_t n){    assert(dest && src && n > 0);    char *destbak = (char*)dest;    const char*srcbak = (const char*)src;    if(destbak > srcbak && destbak < srcbak+n)  //内存重叠,从后面拷贝    {        while(n--)        {            *(destbak+n) = *(srcbak+n);        }    }    else  //内存不重叠,从前面拷贝    {        while(n--)        {            *destbak++ = *srcbak++;        }    }    return dest;}

-给两个文件,分别有100亿个URL,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法

精确算法:
遍历两个文件,将文件中的URL哈希哈希映射到1000个小文件中,相同的URL肯定映射到相同的编号文件中。
对于每一个小文件,将文件中的URL存到hash表中,再遍历另外一个编号相同的文件,看其中的URL是否在hash表中,如果在说明这个URL是两个文件的交集,存放到文件中。此种算法时间复杂度为O(N)

近似算法:
利用布隆过滤器,布隆过滤器原理是将一个query通过好几个散列函数对位图表示的最大值求模后映射到一个位图的好几个位上,判断一个query在不在这个布隆过滤器中,也是判断这个位图中的这几个位是不是都是1,
如果这几个位都为1,这个query可能在这里,如果只要有一个位不为1,这这个query肯定不在。

所以可以将第一个文件中的query映射到布隆过滤器中去,
拿第二个文件中的query到第一个文件映射的布隆过滤器中去对比
此种算法时间复杂度为O(N)。
注意:布隆过滤器判断不存在是确定的,而存存在在可能导致误判,所以称近似算法

原创粉丝点击