huyc

导航

2011年10月17日 #

内存复制,交换排序,洗牌函数

摘要: 1.string.h里面有一掇内存函数,其中两个是memcpy和memmove,据说两者是有差别的,前面那个是拷贝,区域重合时会覆盖数据;后面那个是移动,效率稍低,但是可以定住重合压力。来个memmove的演示代码:#include <stdio.h>/*移动src的siz个字节到dest,且当两个区域重合时也能正常移动*/void memory_move(char *dest, const char *src, size_t siz){ int off = 0; size_t i, j; if(dest >= src && dest < (src + 阅读全文

posted @ 2011-10-17 23:04 huyc 阅读(707) 评论(0) 推荐(0) 编辑

IPv4报文分片代码

摘要: IP报文内包装了一个ICMP报文,不过还是没法重组报文。想要练习重组报文似乎得直接抓链路层的包才行。#include <sys/types.h>#include <sys/socket.h>#include <sys/uio.h>#include <netdb.h>#include <linux/icmp.h>#include <linux/ip.h>#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include < 阅读全文

posted @ 2011-10-17 16:53 huyc 阅读(1834) 评论(0) 推荐(0) 编辑

2011年10月15日 #

socket(7)

摘要: SOCKET(7)NAME socket —— Linux套接字接口SYNOPSIS#include <sys/socket.h>sockfd = socket(int socket_family, int socket_type, int protocol);DESCRIPTION此手册描述Linux网络套接层用户接口。BSD兼容的通用接口位于用户矜持和内核的网络协议栈之间。协议模块以协议族和套接字类型分组,协议族如AF_INET,AF_IPX,AF_PACKET;套接字类型如SOCK_STREAM或SOCK_DGRAM。参见socket(2)以获取更多有关协议族和类型的信息。套 阅读全文

posted @ 2011-10-15 13:46 huyc 阅读(6011) 评论(0) 推荐(3) 编辑

2011年10月14日 #

send(2)

摘要: SEND(2)NAMEsend, sendto, sendmsg —— 在套接上发送消息SYNOPSIS#include <sys/types.h>#include <sys/socket.h>ssize_t send(int sockfd, const void *buf, size_t len, int flags);ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrle... 阅读全文

posted @ 2011-10-14 11:47 huyc 阅读(1135) 评论(0) 推荐(0) 编辑

2011年10月13日 #

内存池和数据移动

摘要: 问题:(a)请编写实现malloc()内存分配函数功能一样的代码。(b)给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。想法:1.malloc的分配算法已经N多人研究过了,基于链表的内存池性能不太好,但算法简单,有三种,首次适配,下次适配,最佳适配;基于桶的内存池将等价类映射到桶里面,查找性能较好,据说对桶应用首次适配就可以达到渐进最优的内存利用率。2.如果没理解错,字符串A和B具有相同部分,需要复制类似于abcd,cdef这样的两个字符串,并且要求合并相同部分以得出abcdef。实现:1.基于链表的存储池,内存小时性能有点太差,可以体会下产生大量碎片时的程 阅读全文

posted @ 2011-10-13 20:37 huyc 阅读(397) 评论(0) 推荐(0) 编辑

2011年10月12日 #

生成字符串排列

摘要: 问题:给出一个函数来输出一个字符串的所有排列。想法:排列算法流行的有递归,置换,字典序法。1.递归算法,每个n排列是每个字符与n-1排列的结合。算法的核心部分是维持一个递归树,从树根到树叶的一条路径是一个排列。2.置换算法,基于置换群的理论,每完成一次置换生成一个排列。3.字典序法,每次生成排列的下一个排列,可以通过数值计数来模拟,当然也可以手工生成。实现:1.递归算法:#include <stdio.h>void swap(char *l, char *r){ char s = *l; *l = *r; *r = s;}void generate(char *buf, ch... 阅读全文

posted @ 2011-10-12 11:00 huyc 阅读(554) 评论(0) 推荐(0) 编辑

2011年10月11日 #

将字符串转换为数字

摘要: 问题:写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)想法:在不考虑负数的情况下,生成整数的基本做法就是不断做乘法,其实就是一个最基本的多项式:12345 = 1*10^4+2*10^3+3*10^2+4*10+5 = 10*(10*(10*(1*10+2)+3)+4)+5用程序很容易实现:#include <stdio.h>#include <ctype.h>int GetInt(const char *buf){ int r, sig; sig = 0; buf; if(*buf == '-& 阅读全文

posted @ 2011-10-11 18:53 huyc 阅读(483) 评论(0) 推荐(0) 编辑

寻找绝对值最小的对儿

摘要: 问题:有一个整数数组,请求出两两之差绝对值最小的值(记住,只要得出最小值即可,不需要求出是哪两个数)。想法:1.最起码的想法自然就是穷举了,复杂度相当高,两个循环,O(n^2),其实也不是很高哦。2.适当变换一下题目的说法,两两绝对值之差最小,想象一下数轴,绝对值是两者距离,距离之差最小,就是数轴上的数距离最小,那排序就是很自然地想法了,排序之后的搜索过程复杂度为O(n),也就是说,如果采用搜索法,复杂度下限就是Ω(n)。接下来是排序算法,根据《算法导论》,基于比较的排序的渐进下限O(nlgn),目前性能最好最实用的当属快排了,应用快排之后的算法复杂度当为O(nlgn)。不基于比较的算法可以把 阅读全文

posted @ 2011-10-11 17:21 huyc 阅读(1507) 评论(0) 推荐(0) 编辑

整数回文验证

摘要: 去笔试的时候,遇到一个回文题,想了好久,主要就是因为题目说验证一个int类型数是否为回文,之前写过却忘了,真是杯具,这次要写下来杜绝忘记。回文都是老题了,但是之前都是在说那啥字符串的回文,把首尾去掉,递归验证什么的,整数回文自然不应该用字符串那套,应该用堆栈。比如123321,一步步从后面出栈,就能得到一个123,两个数相等时就表示是回文了。如果是12321的话,堆栈卸出来123,后面这个数比较大时要么入栈一个3,要么出栈一个3,也就回文了。递归的解析也差不多,那个的数据结构叫做双头队列,头尾切掉,判断到最后一个元素,要么是字符,要么是空,只是整数要直接去掉最高位好像有点困难,当然也不是不行, 阅读全文

posted @ 2011-10-11 12:36 huyc 阅读(505) 评论(0) 推荐(0) 编辑

2011年9月25日 #

C语言的指针小发现

摘要: 众所周知,C语言是有指针的,指针本身又是一个数据。C语言的所有数据都是存储在容器中的,指针作为一种数据,自然应该有一个容器。然而C语言的指针在两个地方是特别的,或者说有三种行为,其中两种比较怪。第一种是纯数组,这种数据带占据连续的内存,没有间隙,可以随意用不同的指针转换之:1 char arr[64]; //64个char2 int *arr1 = (int *)arr; //64/sizeof(int)个int3 double *arr2 = (double *)arr; //64/sizeof(double)个double更奇怪... 阅读全文

posted @ 2011-09-25 22:42 huyc 阅读(416) 评论(0) 推荐(1) 编辑