模拟实现memcpy,memmove,atoi,itoa

来源:互联网 发布:尚观云计算课程 编辑:程序博客网 时间:2024/06/06 04:34
void* Memcpy(void* dest,const void* src,size_t count){void* ret=dest;char* str1=(char*)dest;char* str2=(char*)src;assert(dest);assert(src);while(count--){*str1++=*str2++;}return ret;}void Memmove(void* dest,const void* src,size_t count){void* ret=dest;char* str1=(char*)dest;char* str2=(char*)src;assert(dest);assert(src);while(count--){*(str1+count)=*(str2+count);}}


int my_atoi(const char* str){assert(str);int flag=1;int sum=0;while(isspace(*str))str++;if(*str=='-'){flag=0;str++;}else if(*str=='+'){str++;}while(*str){if(isdigit(*str)){sum=sum*10+*str-'0';}elsebreak;str++;}if(flag==0)num=-num;return sum;}char* my_itoa(int value,char* buff){assert(buff);char* left=buff;char* right=NULL;int leftif(value<0)value=-value;while(value){*buff++=value%10+'0';value/=10;}if(value<0)*buff++='-';*buff='\0';right=buff-1;while(left<right){char* temp=right;*right=*left;*left=*temp;}return buff;}
给一个超过100G的log file, log中存着IP地址, 设计算法找到出现次数最多的K个IP地址。 
1、将100G的文件进行切分,分为100个小文件。利用字符串转整数的函数(如 BKDRHash)将IP地址转换为整数key,再利用index=key%100就可将相同IP分到同一个文件。 
2、依次将这100个文件读入内存,统计ip的次数。降序排列,前K个即为该文件中出现次数最多的ip. 
3、将第一个文件中出现次数的最多的前K个ip建小堆,然后读入第二个文件,
将其出现次数最多的前K个ip的出现次数与堆中数据进行对比,如果有大于堆中的ip出现次数,则更新小堆,替换原堆中堆顶元素。再读入第三个文件,以此类推…… 


给两个文件,分别有100亿个URL,我们只有1G内存,找到两个文件交集。分别给出精确算法

和近似算法。 
精确算法:哈希切分 
1、将每个文件切分为1000份,利用字符串转整数的函数(BKDRHash)将query转换为整数key,再利用index=key%1000就可将相同query分到同一个文件。 
2、依次将编号相同的两个小文件加载到内存中进行比较。比如对于A0 && B0,我们可以遍历A0 ,将其中的url存储到hash_map当中。然后遍历B0,如果url在hash_map中,则说明此url在A和B中同时存在,保存到文件中即可。 
近似算法:布隆过滤器 
1、利用不同的字符串转整数的函数将query转换为整数key,再利用位图映射多个位实现。在判断时,必须每个位都有效。但是每一位都重叠映射,可以准确判断不存在的情况,判断存在时有误判。

原创粉丝点击