当前位置:  互联网>综合
本页文章导读:
    ▪hashmap 设计      先来看看泛型的数据队列。 自然界中的数据关系多分为两种,拿人类来看,一类是靠人与人之间的关系来互相关联,我称为关系型,另一种是靠屁股相互关联,我称为位置型。 对于关系型,.........
    ▪rbtree 设计      什么是树? 大街上到处都是,大伙别说没看过,除非你在沙漠中。 树大致可以分为根,茎,枝,叶。 大树枝会套小树枝,树枝上都有叶子。 西方人有个圣诞节,圣诞来了,圣庭老人在树上.........
    ▪Load Testing with Jmeter      JMeter is open source software, a 100% pure Java application designed to load test functional behavior and measure performance. It was originally designed for testing Web Applications but has since expanded to other test functions. Main testing s.........

[1]hashmap 设计
    来源: 互联网  发布时间: 2013-10-24
先来看看泛型的数据队列。
自然界中的数据关系多分为两种,拿人类来看,一类是靠人与人之间的关系来互相关联,我称为关系型,另一种是靠屁股相互关联,我称为位置型。
对于关系型,一个富豪家族,女屌丝想成为其中成员很简单,与其中一个老头建立夫妻关系就加入了这个家族,被虐待了后想脱离它也很简单,解除夫妻关系就完事了。
再看看位置型,比如厕所里有20个坑,上面都贴上数字,有人报告第17个坑堵了,找起来会很方便。再比如某市一个市有20个市长,内部等级顺序都分好了的,在一次内部会议合影时要排序,摄影员喊一声第14位的拉链开了,第14位市长马上就什么知道是自己。
这两种类型的优点都出来了:
关系型:插入,删除成员方便。
位置型:查找方便。

并不是报喜不报忧,对方的优点就是已方的缺点,反之,已方的优点就是对方的缺点,大自然是很奇秒的。

人类最大的创新就是学习和模拟大自然,因为大自然没有申请专利保护。飞机是模彷鸟类,潜艇是模彷鱼类,程序员也要模彷,于是便有了我们的数组和链表,分别对应位置型和关系型。
在标准库里,分别是 vector和 list.
vector 是分配一段连续的内存块,一块一块的被填充,当填充完的时候,就整个重新分配,并把数据迁移过去,就像那些富豪家族在国内发展不了了,整个搬迁米国。
list 来一个分配一个,建立关系,走一个释放一个。

vector,list 不是基于 key-value 型的,要把它封装才能被当作缓存。
于是便有了前文提到的红黑树和本文的主角hash map.
红黑树的思想是关系型的,不过关系复杂点,模彷的更像点,有了父亲,左孩子,右孩子的概念,其实理解成儿子和女儿又有何不可呢。
hash map 自然就是基本位置型的了。

那么hash map的工作原理是什么呢?
从名字上就可以看出来,新数据插入和查找都要经过两步:
1.hash,就是散列。
2.map,就是存储映射。

那么为什么要散列呢,一切都是为了找位置,明白了么,就像那么多副市长,是怎么排序的,可以靠体型,也可以靠体重,散列的方法有很多种。
比如两个字符串key: 
1.hello
2.world

如何才能快速的定位到哪个位置呢,可以把以首字母的ascii码为key, 就能快速存储和快速查找了。hello 对应的是104, world 对应的是119.
hello 104
world 119

建立了一个对应表,既是hash表,也是map表。
再复杂一点,比如有下面的场景:
1.hello
2.hello world
3.world

第1种和第2种如何区别呢,共同对应104位,这个问题在学术上叫散列冲突,比如恰好有两个副市长的体重一样。

下面看看我是怎么设计hash map的

typedef struct yumei_hash_map_s yumei_hash_map_t;
typedef struct yumei_cache_data_s yumei_cache_data_t;

struct yumei_hash_map_s
{
	int  reserve;
	yumei_cache_data_t*   data;

};

struct yumei_cache_map_data_s
{
	int key;
	int times;
	int start_time;

	void*  data;

	yumei_cache_map_data_t* next;
};

yumei_hash_map_t*   yumei_hash_map_create();
int yumei_hash_map_release( yumei_hash_map_t* hm );

int yumei_hash_map_insert( yumei_hash_map_t* hm, int key, void* data );
int yumei_hash_map_get( yumei_hash_map_t* hm, int key, void** data );
int yumei_hash_map_check( yumei_hash_map_t* hm );
int yumei_hash_map_update( yumei_hash_map_t* hm, int key, void* data );

整个框架就搭起来了,核心是散列和冲突的解决。
散列算法:
int kv = key &( reserve - 1 );

冲突解决:
while( tmp ){
	if( tmp->key == key ){
		break;
	}

	tmp = tmp->next;
}

data = tmp->data;

其实是在同一个位置上多挂几个,就像一个市长位置上有几个候选人,散列以后再来比对,这是最简单有效的方法,当然如果需要在挂列上再进行排列或者特殊场景下的二次散列可能效果更好。

作者:xiaofei_hah0000 发表于2013-6-3 13:54:24 原文链接
阅读:68 评论:0 查看评论

    
[2]rbtree 设计
    来源: 互联网  发布时间: 2013-10-24
什么是树?
大街上到处都是,大伙别说没看过,除非你在沙漠中。
树大致可以分为根,茎,枝,叶。
大树枝会套小树枝,树枝上都有叶子。
西方人有个圣诞节,圣诞来了,圣庭老人在树上的每个枝丫上都挂了礼物,礼物上都写上一个小朋友的名字,让小朋友去树上摘。
问题来了,现在有两颗树,
A                                                                  B


A是身材高大的水杉,不管有多少礼物,总有一个高度能满足你。
B是不太高但枝繁叶茂的荔枝树,每个枝丫的高度都差不多。
选哪颗树呢,如果选择A,分在低枝上的小朋友很容易拿,高一点的就会抱怨了。
看来要果断点选择B了。
可是还有一个问题,如何才能让小朋友快速知道自己的礼物在哪个枝上呢?

这个问题直到1972年才被Rudolf Bayer这个家伙解决了,解决思路是这样的:

1.把所有枝丫都挂个颜色标签,要么是红的要么是黑的。
2.根枝丫是黑的。
3.每颗叶子都是黑色的。
4.红色枝丫的分枝或叶子是黑色的。
5.任一枝丫到其分枝的任何一个叶子路径中都经过相同的黑色支丫。
6.礼物挂在枝丫或者叶子上
7.按小朋友的出生年月排序挂上。

看问题看实质,这个解决方案的实质是解决了小朋友的公平性,圣诞老人要累点,每插入一个礼物,可能都要改变一下相邻节点的方位,没关系,圣诞老人可以请零时工哈,树枝挂断了也不用负责多好。

这样,我们的红黑树就应运而生了。

我们先来看看红黑树的定义,维基百科上是这么说的:
红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由鲁道夫·贝尔发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。
红黑树具有以下的性质:
红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
性质1. 节点是红色或黑色。
性质2. 根是黑色。
性质3. 所有叶子都是黑色(叶子是NIL节点)。
性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

实际开发中,如何定义一个红黑树呢?
我是这样定义的:

#define YUMEI_RBTREE_COLOR_BLACK  0
#define YUMEI_RBTREE_COLOR_RED    1

typedef struct yumei_rbtree_s yumei_rbtree_t;
typedef struct yumei_rbtree_node_s yumei_rbtree_node_t;
typedef struct yumei_rbtree_key_s yumei_rbtree_key_t;

struct yumei_rbtree_key_s
{
	int key[ 8 ];
};

struct yumei_rbtree_s
{
	yumei_rbtree_node_t   *root;
	yumei_rbtree_node_t   *leaf;
	int                    count;

	yumei_mem_pool_t      *pool;
};

struct yumei_rbtree_node_s
{
	yumei_rbtree_node_t *left;
	yumei_rbtree_node_t *right;
	yumei_rbtree_node_t *parent;
	int                  color;

	yumei_rbtree_key_t   key;
	long                 data[0];

};

#define yumei_rbtree_black( node ) \
	( node )->color = YUMEI_RBTREE_COLOR_BLACK 
#define yumei_rbtree_red( node ) \
	( node )->color = YUMEI_RBTREE_COLOR_RED

#define yumei_rbtree_is_red( node ) \
	( node )->color

#define yumei_rbtree_is_black( node ) \
	!( node )->color

yumei_rbtree_key_t 这个结构以现实遇到的为准,可以是你现基本类型。
为什么要定义一个leaf呢,其实它是所有末节点的叶子,为了能够在操作中有相同的操作方式,所以不用NULL,而指向同一个叶子。
初始函数
yumei_rbtree_t* yumei_rbtree_create()
{
	yumei_rbtree_t         *tree;
	yumei_rbtree_node_t    *leaf;
	yumei_mem_pool_t       *pool;
	yumei_mem_buf_t        *buf;
	int                     size;

#define YUMEI_RBTREE_POOL_BLOCK_SIZE 1024
#define YUMEI_RBTREE_POOL_BLOCK_NUM  8
	pool = yumei_mem_pool_create( YUMEI_RBTREE_POOL_BLOCK_SIZE, YUMEI_RBTREE_POOL_BLOCK_NUM );

	if( !pool ){
		goto error;
	}

	size = sizeof( yumei_rbtree_t );
	buf = yumei_mem_buf_malloc( pool, size );
	if( !buf ){
		goto pool_error;
	}

	tree = buf->data;

	size = sizeof( yumei_rbtree_node_t );
	buf = yumei_mem_buf_malloc( pool, size );
	if( !buf ){
		goto pool_error;
	}

	leaf = buf->data;
	
	tree->root = tree->leaf = leaf;
	tree->pool = pool;
	tree->count = 0;

	yumei_rbtree_black( leaf );

	return tree;

pool_error:
	yumei_mem_pool_free( pool );

error:
	return 0;

}

释放函数
#define YUMEI_RBTREE_ERROR  -1
#define YUMEI_RBTREE_OK      0

int yumei_rbtree_free( yumei_rbtree_t *tree )
{
	yumei_mem_pool_t        *pool;

	if( !tree ){
		return YUMEI_RBTREE_ERROR;
	}

	pool = tree->pool;

	yumei_mem_pool_free( pool );

	return YUMEI      
    
[3]Load Testing with Jmeter
    来源: 互联网  发布时间: 2013-10-24

JMeter is open source software, a 100% pure Java application designed to load test functional behavior and measure performance. It was originally designed for testing Web Applications but has since expanded to other test functions.

Main testing steps:

  • Double click jmeter.bat to open the Jmeter UI.
  • Open xxx.jmx file (test case file)
  • Click green "start" button in toolbar to start running testing.
Brief introduction to use Jmeter
  • HTTP Request Defaults element: define server name or IP and port number in it as follows.

  • HTTP Header Manager element: define some http header variables in it as follows  

  • User Defined Variables element: define some variables that will be used later in our http request.

  • CSV Data Set Config element: get token from csv file

  • Response Assertion element: use it to define how a http request is responded successfully.

  • Other elements: Please refer to Jmeter help document.

  • All elements can be added right-click menu "Add".

  • Test Result: We can check the test results in Summary Report element (result statistics) and View Results Tree element (success or failed).

 

  • All elements can be Enable/Disable via right-click menu to support run or skip run for specific elements.

 

  • How to set up heap for JVM: in Jmeter.bat, set HEAP=-Xms4g -Xmx4g to your wanted size.

  • It's better to test all APIs separately. (i.e. test one API one time)


Environment Requirment:
  • Java(TM) SE Runtime Environment: download latest jre 
    http://www.oracle.com/technetwork/java/javase/downloads/index.html



作者:chuwachen 发表于2013-6-3 17:17:19 原文链接
阅读:57 评论:0 查看评论

    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3