![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 87
庾志辉
这个作者很懒,什么都没留下…
展开
-
一致性hash算法 - consistent hashing
consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在cache 系统中应用越来越广泛;1 基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的转载 2014-08-25 17:27:52 · 1423 阅读 · 0 评论 -
排序算法之 插入排序、希尔(shell)排序 及其时间复杂度和空间复杂度
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这原创 2015-03-26 11:28:38 · 17288 阅读 · 2 评论 -
排序算法之 选择排序 及其时间复杂度和空间复杂度
其实选择排序是非常简单的,和冒泡排序有异曲同工之妙。就是把元素分成两部分,一部分是有序的,另外一部分是无序的;每次循环从无序的元素中选取一个元素放到有序的元素中,依次循环到最后把所有元素都放到了有序那一部分中(也就是无序部分,元素为零);原创 2015-03-17 11:44:19 · 24146 阅读 · 1 评论 -
排序算法之 基数排序 及其时间复杂度和空间复杂度
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。原创 2015-03-24 16:51:13 · 29408 阅读 · 4 评论 -
排序算法之 归并排序 及其时间复杂度和空间复杂度
在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之媲美,那就是归并排序;归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数组,直到子数组里面只有一个元素,那么就自然排好序了,可以总结为先排序再递归;归并排序:先什么都不管,把数组分为两个子数组,一直递归把数组划分为两个子数组,直到数组里只有一个元素,这时候才开始排序,让两原创 2015-03-12 16:16:47 · 58526 阅读 · 2 评论 -
排序算法之 堆排序 及其时间复杂度和空间复杂度
堆排序是由1991年的计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap Sort ); 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非原创 2015-03-14 12:02:05 · 58986 阅读 · 15 评论 -
排序算法之 冒泡排序 及其时间复杂度和空间复杂度
冒泡排序算法是所有排序算法中最简单的(前面也提到过),在生活中应该也会看到气泡从水里面出来时,越到水面上气泡就会变的越大。在物理上学气压的时候好像也看到过这种现象;其实理解冒泡排序就可以根据这种现象来理解:每一次遍历,都把大的往后面排(当然也可以把小的往后面排),所以每一次都可以把无序中最大的(最小)的元素放到无序的最后面(或者说有序元素的最开始);原创 2015-03-17 11:46:06 · 37496 阅读 · 0 评论 -
sk_buff整理笔记(二、操作函数)
sk_buff整理笔记(一、数据结构)这一篇要讲的是内核为sk_buff结构提供的一些操作函数:(a)skb_put(), (b)skb_push(), (c)skb_pull(), and (d)skb_reserve(); 四大指针分别是:head、data、tail、end;这四个指针都是指向了数据区的,数据区中存放的是协议头和数据。head和end指针是每个数据包一样的,也是有这两个指针来确定数据区的大小的。最开始的时候head、data、tail三个指针都是指向一起的,当有协议数据加进来时才更原创 2014-08-20 23:21:05 · 8717 阅读 · 1 评论 -
sk_buff整理笔记(五、队列管理函数)
分析sk_buff结构及相关结构的队列管理函数:初始化函数,skb_queue_head_init(struct sk_buff_head *list);插入函数,kb_queue_head(),skb_queue_tail();出队列函数,sk_buff *skb_dequeue(struct sk_buff_head *list),sk_buff *skb_dequeue_tail(struct sk_buff_head *list);清空队列函数,skb_queue_purge(struct sk_b原创 2014-08-31 22:37:54 · 7087 阅读 · 0 评论 -
sk_buff 整理笔记(一、数据结构)
对sk_buff结构体以及相关的sk_buff_head结构体、sk_buff结构体数据区、sk_shared_info分片结构体、分片结构体的数据区的常用成员字段进行透彻的分析。以及分析这几个结构体的关系与一个sk_buff数据包的形成和其data指针的变化。 (1)sk_buff->data_len:只计算分片中数据的长度,即是分片结构体中page指向的数据区长度。这个在分片结构体中会再详细讲解下。 (2)sk_buff->len:表示当前缓冲区中数据块的大小的总长度。它包括主缓冲中(即是sk_原创 2014-08-18 21:47:11 · 30723 阅读 · 23 评论 -
sk_buff整理笔记(三、内存申请和释放)
内核对于sk_buff结构的内存分配不是和一般的结构动态内存申请一样:只分配指定大小的内存空间。而是在开始的时候,在初始化函数skb_init()中就分配了两段内存(skbuff_head_cache和skbuff_fclone_cache )来供sk_buff后期申请时用,所以后期要为sk_buff结构动态申请内存时,都会从这两段内存中来申请(其实这不叫申请了,因为这两段内存开始就申请好了的,只是根据你要的内存大小从某个你选定的内存段中还回个指针给你罢了)。如果在这个内存段中申请失败,则再用内核中用最低层原创 2014-08-21 22:00:46 · 9450 阅读 · 2 评论 -
sk_buff整理笔记(四、克隆与复制)
上面的pskb_copy()函数和skb_clone()函数类似:skb_clone()函数克隆出来的skb结构不能修改其共享数据区的数据,而pskb_copy()函数也是一样的,克隆出来的skb及数据区不能修改共享的分片结构数据区内容。所以如果想要修改分片结构数据区的内容,则必须要用skb_copy()函数来克隆skb结构体。skb_copy()函数是对skb结构体真正的完全复制拷贝。不仅是sk_buff结构体还有data指针指向的数据区(包括分片结构)以及分片结构中指针指向的数据区,都各自复制拷贝一份。原创 2014-08-25 21:41:07 · 6890 阅读 · 1 评论 -
hlist哈希链表的实现--C代码实现程序
hlist 哈希链表的实现--C代码实现程序(用户态)。在前面已经对哈希链表进行了全面的讲解,包括哈希链表的定义,哈希链表的哈希函数以及怎么处理哈希碰撞问题。如果不是很熟悉哈希链表的一些的概念的可以先稍微看下hlist 哈希链表介绍,我想这会帮助你了解接下来要看到的:hlist 哈希链表的实现--C代码实现程序(用户态)。原创 2014-08-14 22:14:45 · 2309 阅读 · 1 评论 -
hlist 哈希链表介绍
什么是哈希链表(又称为散列表)?哈希链表的定义是什么?哈希函数是什么?怎么构建哈希函数才是最合理,有哪几种构建方法?怎么处理哈希碰撞问题?有C语言实现的具体哈希链表。 哈希表又称散列表,是为了加快元素查询而设计的一种数据结构。基本原理是:把需要查询的关键字通过映射函数(散列函数)映射到相应的存储地址,然后直接访问元素。需要存储或者查询的元素一般称为关键字(Key value),而这个映射函数一般称为散列函数,映射到的存储地址一般称为散列表。 用散列表数据结构和其他数据结构的优劣区别原创 2014-08-02 17:23:33 · 2662 阅读 · 0 评论 -
排序算法之 计数排序 及其时间复杂度和空间复杂度
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。#include #include void print_array(int *array, int length) { int index = 0原创 2015-03-23 11:44:11 · 9891 阅读 · 1 评论