lionel chang

导航

2012年8月30日 #

字节顺序&字节对齐

摘要: 一.字节顺序的产生在计算机中,数据是以字节为单位存放的,而c语言中只有char才是一个字节,其他如int,float都是大于一个字节,所以就存在将数据按怎样的顺序存放的问题。一般有大端序和小端序两种方式,特殊的还有混合序,也就是两种存放方式同时存在于一个计算机系统中。上面讲的都是主机字节顺序。网络字节顺序是指在网络中传输数据的所遵循的字节顺序。TCP/IP采用的是大端序。二.大端序和小端序大端序是指数据的低位保存在高地址,数据的高位保存在低地址。对于0X1122,采用大端序进行保存,则如左图所示小端序是指数据的低位保存在低地址,数据的高位保存在高地址。对于0X1122,采用小端序进行保存,则如 阅读全文

posted @ 2012-08-30 22:36 woshizyl 阅读(160) 评论(0) 推荐(0) 编辑

2012年8月28日 #

内部排序总结(四)归并排序

摘要: 一.概念归并是指将两个有序表合并为一个有序表。归并排序先将待排记录分割成一个一组,两个相邻组进行归并,得到两个一组的记录集合,再将相邻的组进行归并,如此,分割-合并,直到所有都排序好为止。代码:void merge(int src[],int res[],int start,int mid,int end) {//将有序表src[start...mid]和res[mid+1...end]合并到有序表res[start...end]中 int i,j,k; for(i=start,j=mid+1,k=i;i<=mid&&j<=end;++k) { ... 阅读全文

posted @ 2012-08-28 09:09 woshizyl 阅读(119) 评论(0) 推荐(0) 编辑

2012年8月26日 #

内部排序总结(三)选择类排序

摘要: 一.简单选择排序简单选择排序在每趟中选择一个最小的数,与当前关键字进行比较。如果不相同,交换二数。如此进行len-1趟。void selectSort(int arr[],int len) { ///升序 int i,j,min; for(i=1;i<len-1;i++) { min=i; for(j=i+1;j<len;j++) { if(arr[j]<arr[min]) ... 阅读全文

posted @ 2012-08-26 18:39 woshizyl 阅读(137) 评论(0) 推荐(0) 编辑

2012年8月24日 #

内部排序总结 (二)交换排序

摘要: 交换类排序主要有冒泡排序和快速排序,其中快速排序是对冒泡排序进行了改进。一.冒泡排序冒泡排序也有两层循环,外层循环控制循环的边界,内层循环控制将要比较的元素下标。每次都是比较两个相邻的元素,最后最大的元素会被交换到最后一个位置,如此往复,直到不再进行交换为止。#include<stdio.h> #define TRUE 1 #define FALSE 0 void bubbleSort(int arr[],int len) { int i,j; int change; for(i=len-1,change=TRUE;i>0&&change;i-... 阅读全文

posted @ 2012-08-24 18:38 woshizyl 阅读(164) 评论(0) 推荐(0) 编辑

内部排序总结(一)插入排序

摘要: 所谓内部排序是指在内存中的排序,而外部排序则是待排数据过大以至于内存中一次性不能容纳全部记录,排序过程中需要对外存进行访问。根据所依据的原则,可以将内排分为插入排序,交换排序,选择排序,归并排序,基数排序五类。以下将对每种排序方法从算法的基本思想,时间复杂度,空间复杂度,稳定性上进行讨论。其中稳定性是指如果按照某种排序算法排序后,两个关键字相同的记录的顺序不发生变化,则这种排序算法是稳定的;否则,不稳定。一。插入排序1.直接插入排序是最简单的排序算法。每次将待插入数据插入到已经排序好的有序表中。i.空间复杂度因为只用到arr[0],i,j这三个辅助空间,所以空间复杂度为O(1)。ii.时间复杂 阅读全文

posted @ 2012-08-24 12:50 woshizyl 阅读(146) 评论(0) 推荐(0) 编辑

2012年8月22日 #

linux的进程组织方式

摘要: 前面说从认识task_struct开始学习内核,今天又能了解里面的几个域了。一。进程链表每个task_struct中都有一个tasks的域来连接到进程链表上去。struct task_struct{ ... struct list_head tasks; ... char comm[TASK_COMM_LEN];//可执行程序名 ... };而这个链表的头是init_task.它是0号进程的PCB,0号进程永远不会被撤销,它被静态的分配到内核数据段上。也就是Init_task的PCB是由编译器预先分配的,在程序运行的过程中一直存在,直到程序结束。 struct task_s... 阅读全文

posted @ 2012-08-22 09:40 woshizyl 阅读(370) 评论(0) 推荐(0) 编辑

2012年8月21日 #

从task_struct开始学习linux内核

摘要: 一。数据结构进程控制块PCB(Process Control Block)是进程存在和运行的唯一标志,在Linux中用task_struct这个结构体来表示。这个结构体中有很多数据项,查看源代码时没必要理解全部的数据项,只需要在以后使用时再理解。struct task_struct { .... };下面重点介绍几个基本的数据项:1。进程状态task_struct中用一个长整形state表示进程的状态。volatile long state;在linux中有四种基本的进程状态:(1)就绪态(TASK_RUNNING):包括了运行态的进程。这是为了方便管理,因为任意时刻处于就绪态的进... 阅读全文

posted @ 2012-08-21 16:27 woshizyl 阅读(208) 评论(0) 推荐(0) 编辑

C语言中几个关键字(inline,volatile,static)

摘要: 一。inlineinline关键字一般用于定义内联函数,所谓内联函数与一般函数的区别是:1.内联函数一般比较短小,只有几行代码2.调用内联函数没有调用一般函数所必需的保护堆栈的开销,调用时直接把它嵌入到调用函数中。inline与宏定义十分相似,但是必须知道它们之间的区别:调用inline时会进行类型检查,而宏定义是没有类型检查的二。volatilevolatile在英语中的意思是”易变的“,用它定义的变量在程序编译阶段不做优化,每次都不必须从内存中读取变量的值。volatile有以下几个方面的应用: i.并行设备的硬件寄存器(如:状态寄存器)ii。一个中断服务子程序中会访问到的非自动变量iii 阅读全文

posted @ 2012-08-21 15:36 woshizyl 阅读(680) 评论(0) 推荐(0) 编辑

2012年8月19日 #

linux内核中红黑树

摘要: 一.红黑树的定义一颗红黑树必须满足以下几点:1.树的节点要么是红色,要么是黑色。2.根结点一定是黑色3.所有叶子节点都是黑色的。(注意,红黑树的叶子节点是NULL节点)4.每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)5.从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。以上几点保证了红黑树的关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。从而,保证了红黑树是平衡的。二.旋转、插入、删除在红黑树进行了插入、删除操作后,要保证红黑树仍然是平衡的,必须对相应的节点进行旋转。关于旋转请参考王哲的博客基于树的查找--------- 阅读全文

posted @ 2012-08-19 18:12 woshizyl 阅读(185) 评论(0) 推荐(0) 编辑

2012年8月14日 #

最短摘要生成

摘要: 问题定义:给定一个字符串str,以及一个关键字字符串数组key,求str中包含key中所有字符串的最短子串。基本方法:双指针扫描字符串详细算法:1.使用start和end两个整数来指示扫描位置。均初始化为0。 2.对end加1,直到str[start,end]中包含所有关键字,或者end>=strlen(str) 3.对start加1,直到str[start,end]中不能再包含所有的关键字。 4.若str[start,end]的长度小于上次记录的长度abstractLen,则将当前长度赋给abstractLen; 5.重复2-4步,直到end>=strlen(str);如果是.. 阅读全文

posted @ 2012-08-14 15:06 woshizyl 阅读(117) 评论(0) 推荐(0) 编辑