C/C++
文章平均质量分 89
sunjiangangok
这个作者很懒,什么都没留下…
展开
-
负载均衡算法小结
互联网分布式系统中,很多服务是数据存储相关的,海量访问量下,直接访问存储介质是抗不住的,需要使用cache,cache集群的负载均衡算法就成为一个重要的话题,这里对现有的负载均衡算法进行一些总结。BTW:虽然是Cache负载均衡算法小结,其实可以说是负载均衡算法小结,只是针对Cache应用场景罢了。负载均衡算法主要有:Static算法Random算法Round robin算法Hash算法CARP算原创 2017-04-10 10:46:33 · 253 阅读 · 0 评论 -
linux内核list.h头文件分析(六)——hlist分析
(五)hlist的搬移操作还记得list_move(struct list_head *list, struct list_head *head)吗?这个表示将list从一个链表当中删除之后,加入到一新的链表head当中。在hlist中的搬移指的是,将new指向old所指向的那个链表。搬移之后,如果new的第一个元素不为空,则修改它的pprev值。static inline void hlist_原创 2017-04-10 10:32:55 · 531 阅读 · 0 评论 -
linux内核list.h头文件分析(五)——hlist分析
hlist概述在前面分析了的list,hlist和list是不相同的,在list中每个节点都是一样的,不管头结点还是其他节点,使用同一个结构体表示,但是hlist不是这样表示的。在hlist中,头结点使用的是struct hlist_head来表示的,而对于其他节点使用的是struct hlist_node这个数据结构来表示的。另外,还有一点hlist和list是不相同的,hlist不是双向循环链原创 2017-04-10 10:32:43 · 648 阅读 · 0 评论 -
用栈实现括号匹配
最近在复习数据结构,有关栈的一个问题:括号匹配。问题描述:输入一串括号,然后判断左右括号是不是匹配的。实验程序:/*brackets_match.c*/#include stdio.h>#define M 100typedef struct Stack { char element[M]; int top;}Stack;void InitStack(原创 2017-04-10 10:32:31 · 532 阅读 · 0 评论 -
linux内核list.h头文件分析(四)
(十一)链表的宏遍历在开始链表的遍历之前,先看一个问题:通过一个结构体的成员变量如何访问其他结构体成员的变量。我们先看一个例子吧:有这个结构体struct symbol_list { int num; char value[STR_TOKEN]; //STR_TOKEN为一个宏定义的一个整数 struct list_head list;};我们的目标是通原创 2017-04-10 10:32:26 · 434 阅读 · 0 评论 -
linux内核list.h头文件分析(三)
(八)旋转链表的第一个节点到最后这个函数的操作的最终结果是将head的next与head自己本身进行了交换。static inline void list_rotate_left(struct list_head *head){ struct list_head *first; if (!list_empty(head)) { first = head->原创 2017-04-10 10:32:21 · 380 阅读 · 0 评论 -
linux内核list.h头文件分析(二)
(四)删除结点指定一个结点,删除这个结点我们调用的话,调用static inline void list_del(struct list_head *entry)这个函数接口就可以了。static inline void __list_del(struct list_head * prev, struct list_head * next){ next->prev = prev;原创 2017-04-10 10:32:16 · 574 阅读 · 0 评论 -
linux内核list.h头文件分析(一)
之前上《linux操作系统》课程的时候,陈老师安排的一个作业就是分析linux内核中的头文件list.h,但是之前我没有认真做,都是完成任务式的去做。 今天比较伤心些,一个同学问我list.h中的#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) \ struct list_head原创 2017-04-10 10:32:04 · 740 阅读 · 0 评论 -
线性表的合并
好久都没有用c语言写程序了,对于c语言都有些生疏了~在暑期最后这十几天内,把数据结构好好复习一下吧,今天静下心来,慢慢复习数据结构时候,发现自己长时间没有编写程序了,竟然编写一个简单的线性表的合并花费的2个多小时,唉,看来程序还是要坚持写的,不能放下~题目要求:有两个线性表a和b,这两个线性表都是非递减有序排列,现在要把这两个线性表合并为一个非递减有序排列的c线性表。算法思想:用i,j,k这3个指原创 2017-04-10 10:31:59 · 1135 阅读 · 0 评论 -
c语言宏定义总结
宏定义了一个代表特定内容的标识符。 预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。 宏最常见的用法是定义代表某个值的全局符号。 宏的第二种用法是定义带参数的宏,这样的宏可以象函数一样被调用,但它是在调用语句处展开宏,并用调用时的实际参数来代替定义中的形式参数。 1.#define指令 #define MAX_NUM 10 int array[MAX_NUM]; fo原创 2017-04-10 10:31:54 · 367 阅读 · 0 评论 -
互斥与同步
同步:相互合作的两个进程之间需要在某个(些)确定点协调它们的工作,一个进程到达了该点后,除非另一进程已经完成了某些操作,否则就不得不停下来,等待这些操作的完成。这就是进程间的同步。互斥:两个进程由于不能同时使用同一临界资源,只能在一个进程使用完了,另一进程才能使用,这种现象称为进程间的互斥。特征:①同步的主要特征是:一个进程在某一点上等待另一进程提供信息,两进程之间存在直接制约关系,其表现形式为进原创 2017-04-10 10:31:18 · 289 阅读 · 0 评论 -
数据结构字符串匹配——Brute-Force算法
在数据结构的书上有这个问题的描述。问题描述:已知一字符串str,并给出字串sub_str,然后判断sub_str是不是在str中,并且输出相应的信息。算法描述:使用三个指示器——i, j, start。start:表示每趟比较的时候str的起点。i:表示在每趟比较当中,str的移动指针。j:表示在每趟比较当中,sub_str的移动指针。#include stdio.h>#include str原创 2017-04-10 10:33:03 · 456 阅读 · 0 评论 -
巧记const, char, *的区别
在《The C++ Programming Language》中把*读作"pointer to"(指向)。所以记忆这三者的区别抓住亮点:(1)*读作point to;(2)声明从右向左读。char * const p; // p is a const pointer to char; p是指向char的常量指针(p不可以变化)char const * p; // p is a point原创 2017-04-10 10:33:15 · 315 阅读 · 0 评论 -
查找算法复习——线性表的查找
在复习数据结构的时候,我对查找也算学得比较好的,但是今天复习这块知识的时候,发现是那么的陌生,不知道是用的少,还是什么原因,这个时候,要是我当时能够写博客把那些东西总结一下,是不是效果会好些的,所以我要坚持写博客。 查找分为两类——比较式的查找和计算式的查找。比较式的查找又分为线性查找法和基于树的查找法;而计算式的查找法就是哈希查找了。 线性表的查找: 1)顺序查找法。对于这种查原创 2017-04-10 10:33:28 · 797 阅读 · 0 评论 -
有关sizeof()的实现
最近老是遇到与sizeof()相关的问题,都是一些小问题,但细节决定成败啊。好了,我们先看一个问题:struct stu { char b; int a; short c;};对于这个结构体的sizeof(struct stu)结果是:12。struct stu { int a; char b; short c;};对于这个结构体的sizeof(s原创 2017-04-10 10:37:33 · 884 阅读 · 0 评论 -
利用strstr简单求最大字串
问题描述:输入两个字符串,求得两个字符串的最大字串。问题分析:为了求得两个字符串的最大字串,其中一种思路是这样的。两个字符窗分别为a和b (strlen(a)程序实现:#include stdio.h>#include stdlib.h>#include string.h>char *max_str(char *long_str, char *short_str){原创 2017-04-10 10:37:02 · 254 阅读 · 0 评论 -
几个位操作的例子
问题1:不申请变量,实现两个数据的交换。算法分析:对于这个题目,相信许多人都接触过,如果使用异或操作的话,只要抓住一点:一个数a与另外一个数b异或两次之后,最终的值结果仍然是a。测试程序&&测试结果:^_^[sunny@sunny-laptop ~/DS/bit_switch]7$ cat first.c #include stdio.h>int main(){ int原创 2017-04-10 10:35:05 · 308 阅读 · 0 评论 -
排序算法复习——选择类排序
在选择类排序算法中,有简单选择排序,树型选择排序,堆排序简单选择排序:对于选择排序的理解应该比较简单些,演练程序:#include stdio.h>#define N 10int main(){ int a[N] = {62, 48, 35, 77, 55, 14, 35, 98, 22, 10}; int i, j, k, tmp; for(原创 2017-04-10 10:34:37 · 218 阅读 · 0 评论 -
排序算法复习——交换类排序
在交换类排序算法中,有冒泡排序和快速排序。冒泡排序:这个算法大家估计很熟悉了,不做介绍了。这里有一个算法优化的地方,那就是设置标志位,如果在上一趟的比较当中,没有进行交换的话,就说明已经排好序了,不需要再进行排序了。演练程序:#include stdio.h>#define N 10int main(){ int a[N] = {62, 48, 35, 77, 55,原创 2017-04-10 10:34:25 · 243 阅读 · 0 评论 -
排序算法复习——插入类排序
在插入类排序的算法中,有直接插入排序,折半插入排序,希尔排序。直接插入排序:程序代码演练:#include stdio.h>#define N 10int main(){ int a[N] = {62, 48, 35, 77, 55, 14, 35, 98, 22, 10}; int tmp, i, j; for(i = 0; i N; i++) { printf原创 2017-04-10 10:34:20 · 259 阅读 · 0 评论 -
linux内核list.h头文件分析(七)——list.h应用
自己把list.h源文件的代码一下部分做了手脚,下次如果在你的程序当中有用到list或者是hlist的时候,你就可以把我修改之后的内容复制一下,命名为list.h,然后在你的用户程序中写着这么一句#include "list.h"这样的话,你就可以很好的对内核链表进行使用了。改动的地方(代码中的红色部分):1)#define LIST_POISON1 (void *) 0x0#define LI原创 2017-04-10 10:34:10 · 1686 阅读 · 0 评论 -
拆分一个数组的奇偶数
今天上午电话面试,面试官想测试一下我的算法怎么样,给我出了一个拆分数组奇偶数的题目(估计面试官是当时零时想的吧)。题目描述:有一个整型数组,请把所有的奇数放在前部分,所有的偶数放在后半部分。算法描述:面试之前,我刚看了快速排序的算法,脑子里一直留有这个映像,一听题目,我就把这个题目和快速排序结合在了一起,仔细一想,这个题目似乎比快速排序更简单些,快速排序的话,需要多趟,但是这个题目只需要一趟就可以原创 2017-04-10 10:33:57 · 1740 阅读 · 0 评论 -
海量数据处理算法设计
注:本文来源于网络,并非本人所写。本文将向您讲述诸多数据处理面试题以及方法的总结。第一部分、十道海量数据处理面试题1、海量日志数据,提取出某日访问百度次数最多的那个IP。此题,在我之前的一篇文章算法里头有所提到,当时给出的方案是:IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。再详细介绍下此方案:首先是这一天,并且是访问百度的日志中的IP取出来,逐个原创 2017-04-10 10:33:45 · 355 阅读 · 0 评论 -
查找算法复习——二叉排序树
有关二叉排序树的定义是递归定义的。 1)如果左子树是非空的,则左子树上所有结点的值都小于它的根结点的值; 2)如果它的右子树是非空的,则右子树上所有结点的值均大于或者等于它的根结点的值; 3)它的左右子树也分别是二叉排序树。 如下是有关二叉排序树的创建、插入、查找的算法#include stdio.h>#include stdlib.h>#define N 10原创 2017-04-10 10:33:40 · 604 阅读 · 0 评论 -
标准I/O的三种缓冲
最近,有几个同学让我看了一个程序,后来发现问题都是出在使用printf()函数进行输出时的缓冲模式造成的。比如这样的程序:#include stdio.h>int main(){ fprintf(stout,"1234"); while(1); return 0; } 程序并不是很长,但是就这样的程序出现了一个问题:为什么进入死循环之后,并原创 2017-04-10 10:31:06 · 1426 阅读 · 0 评论 -
linux getopt()函数简单使用
记得自己原先写ls函数的时候,没有使用什么命令行参数处理函数,都是自己编写的函数实现的命令行参数的处理,今天在学习POSIX进程间通信的时候发现有一个函数getopt()其实就是专门来做这个事情的,把这个函数的使用简单总结一下吧。 这个函数的定义如下: int getopt(int argc,char * const argv[ ],const char * optstrin原创 2017-04-10 10:30:09 · 344 阅读 · 0 评论 -
fgets()读取一行数据
在一个问题中遇到了一个小问题,自己试了一下,小结一下关于fgets的用法,在man手册中是这样解释的: char *fgets(char *s, int size, FILE *stream); fgets() reads in at most one less than size characters from stream and stores them i原创 2017-04-10 10:24:33 · 7543 阅读 · 0 评论 -
Linux网络编程一步一步学+基础
·Linux网络编程基础(一)·Linux网络编程基础(二)·Linux网络编程基础(三)• Linux网络编程一步一步学-简单客户端编写 • Linux网络编程一步一步学-绑定IP和端口• Linux网络编程一步一步学-循环读取服务器上的数据 • Linux网络编程一步一步学-设置非阻塞方式 • Linux网络编程一步一步学-开启网络监听服务• Linux网原创 2017-04-10 10:24:28 · 729 阅读 · 0 评论 -
算法设计与分析 实验报告
算法设计与分析实验报告题目一:矩阵相乘题目二:最长公共子序列题目一:矩阵相乘一.问题描述给定n个矩阵{A1,A2,... ,An},其中这n个矩阵是可相乘的,i=1,2,...,n-1。算出这n个矩阵的相乘积A1A2 。。。An。补充:如果两个矩阵A和B是可相乘的,那么A的列数要和B的行数是相同的,否则,这两个矩阵是不可相乘的。它们的相乘结果矩阵C的行数是A的行数,而列数是B的列数。二.问题分析由原创 2017-04-10 10:24:17 · 8217 阅读 · 0 评论 -
用c语言模拟进程调度
/* *Author:Mr Sunny *Time:Oct 2010 * */#include #include #include #include #define N 3enum state { e, r, t, w, c};struct PCB { int id, priority, runningtime; enum state status; char name[1原创 2017-04-10 10:24:05 · 1145 阅读 · 0 评论 -
父进程干掉子进程
#include stdio.h>#include sys/types.h>#include unistd.h>#include signal.h>#include ctype.h>#define MAX_CHILD_NUMBER 10#define SLEEP_INTERVAL 1int proc_number=0;void do_something();原创 2017-04-10 10:23:59 · 911 阅读 · 0 评论 -
int const *p 和 const int *p
int const *p 和 const int *p是一样的。 int * const p和 * const int p是一样的。const int * p 内容一定,地址不定 int * const p 内容不定,地址一定 1 #include 2 int main()原创 2017-04-10 10:22:30 · 626 阅读 · 0 评论 -
c语言中的 '\0'
写了一个简单的c语言程序#include main(){ printf("\0asfdjkl;\n\0\n");}执行的结果是没有任何结果,让我很纳闷,后来才知道: '\0'为转义字符,ASCII值为0,printf打印的是字符串,当然没有结果了。 管理员在2009年8月13日编辑了该文章文章。原创 2017-04-10 10:22:10 · 604 阅读 · 0 评论 -
有趣的随机数
下面是随机产生1--10之间的不同值的一段程序:以上程序的可能执行结果是#include #include #include main(){ int i, j, n; int a[10]; srand((int)time(0)); for(i = 0; i a[i] = 1 + (int) ((float)10 * ra原创 2017-04-10 10:21:50 · 412 阅读 · 0 评论 -
整型数据和字符串数据相互转化代码
//将整型转化为字符串void itoa(int n, char *ch, int *len) { if(n = 0) { ch[(*len)++] = (char)(n + '0'); } else { itoa(n / 10, ch, len); ch[(*len)++] = '0' + n%10; }}其中的参数解释为:n为要转化的原创 2017-04-10 10:21:47 · 600 阅读 · 0 评论 -
一个汉字真的由两个字节存放吗?
偶尔间发现了一个程序,让我想起了一个问题:一个汉字真的由两个字节存放吗?先看一个程序段://文件名字为test.c#include #include #include int main(int argc, char *argv[]){ char ch2; FILE *fp; int i; fp = fopen(argv[1],原创 2017-04-10 10:21:09 · 1326 阅读 · 0 评论 -
c语言宏定义详解
注:本文并不是完全转载,增加了部分自己的理解 document.body.oncopy = function () { if (window.clipboardData) { setTimeout(function () { var text = clipboardData原创 2017-04-10 10:24:42 · 857 阅读 · 0 评论 -
关于sscanf的用法
大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。但新手可能并不知道处理字符串时的一些高级用法,这里做个简要说明吧。1. 常见用法。char str[512] = {0};sscanf("123456 ", "%s", str);printf("str=%s\n", str);2. 取指定长度的字符串。如在下例中原创 2017-04-10 10:26:46 · 247 阅读 · 0 评论 -
Linux 3+1班的一道机试题
问题描述:有一个整型数组a,共有1000个元素,即int a[1000]={1, 2, 3, 4...1000},现在请设计一个算法,将每隔两个的数组元素删除,求最后的剩余一个元素的下标和值。如果到结尾的话,从头开始,循环删除。例如有十个数据时a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};删除的顺序是3, 6, 9, 2, 7, 1, 8, 5, 10原创 2017-04-10 10:26:56 · 252 阅读 · 0 评论 -
System V进程间通信—— 消息队列
linux既支持POSIX标准的消息队列,也支持System V的消息队列。 消息队列是这样的一种进程通信方式,是由一条有消息连接而成的链表,是消息的链式队列,它保存在内核中,通过消息队列的引用标识符来访问。要运行通信的信息被放置在一个预定义的消息结构中,进程生成的消息指明了该消息的类型,并把它放入一个由系统负责维护的消息队列中去。而访问消息队列的进程可以根据消息的类型,有选择地从队列中原创 2017-04-10 10:29:24 · 1035 阅读 · 0 评论