数据结构

Kernel数据结构移植(list和rbtree)

浪子不回头ぞ 提交于 2020-03-18 07:15:58
主要移植了内核中的 list,rbtree。使得这2个数据结构在用户态程序中也能使用。 同时用 cpputest 对移植后的代码进行了测试。(测试代码其实也是使用这2个数据结构的方法) 内核代码的如下文件:(内核版本 v3.2 debian 7.5源码) include/linux/list.h (删除了 hlist 相关内容) include/linux/rbtree.h lib/rbtree.c 对上面的代码进行了一些简化,只留了常用的函数。同时删除了其中和内核相关的部分。 主要内容: list 介绍 (循环双向链表) rbtree 介绍 1. list 介绍 (循环双向链表) 1.1 简介 Linux中的链表用法与一般数据结构书中介绍的用法有些不一样。 Linux内核中,为了保证链表的通用性,将链表的节点结构单独抽取了出来,也就是将链表的结构和链表的数据分开定义。 一般数据结构的书中介绍到的链表都是将链表的数据和链表的结构一起定义的。 注: 具体介绍可以我之前的博客参见: http://www.cnblogs.com/wang_yb/archive/2013/04/16/3023892.html 中的 1.2节 里面很重要的一点就是:链表结构和数据分开后,是如何通过链表节点结构来获取数据的? 带有safe的函数或者宏都是可以用于多线程的 1.2 修改部分

数据结构与算法(2)数组

半城伤御伤魂 提交于 2020-03-18 06:59:31
数组 一、什么是数组? 数组是一种线性表数据结构。他用一组连续的内存空间,来存储一组具有相同类型的数据。 线性表 线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,非线性表中,数据之间并不是简单的前后关系。 连续的内存空间和相同类型的数据 数组正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。 寻址公式 a[i]_address = base_address + i * data_type_size base_address为内存块的首地址 i为数组中元素所在 data_type_size表示数组中每个元素的大小 低效的“插入”和“删除” 插入操作 如果在数组末尾插入元素就不需要移动数据,这时的时间复制度为O(1)。但如果在数组的开头插入元素,那所有的数据都需要依次向后移动一位,所以最坏的时间复制度为O(n)。因为我们在每个位置插入元素的概率是一样的,所以平均情况时间复制度为(1+2+...n)/n=O(n)。 如果数组是有序的,如果要将某个数据插入到第k个位置

java Enumeration

馋奶兔 提交于 2020-03-18 01:15:30
某厂面试归来,发现自己落伍了!>>> Enumeration接口 Enumeration接口本身不是一个数据结构。但是,对其他数据结构非常重要。 Enumeration接口定义了从一个数据结构得到连续数据的手段。例如,Enumeration定义了一个名为nextElement的方法,可以用来从含有多个元素的数据结构中得到的下一个元素。 Enumeration接口提供了一套标准的方法,由于Enumeration是一个接口,它的角色局限于为数据结构提供方法协议。下面是一个使用的例子: //e is an object that implements the Enumeration interface while (e.hasMoreElements()) { Object o= e.nextElement(); System.out.println(o); } 实现该接口的对象由一系列的元素组成,可以连续地调用nextElement()方法来得到 Enumeration枚举对象中的元素。Enumertion接口中仅定义了下面两个方法。 ·boolean hasMoreElemerts() 测试Enumeration枚举对象中是否还含有元素,如果返回true,则表示还含有至少一个的元素。 ·Object nextElement() 如果Bnumeration枚举对象还含有元素

数据结构与算法作业——合并两个有序链表

对着背影说爱祢 提交于 2020-03-17 22:41:32
题目:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题算法: class Solution { public : ListNode * mergeTwoLists ( ListNode * l1 , ListNode * l2 ) { if ( ! l1 ) return l2 ; if ( ! l2 ) return l1 ; if ( l1 -> val < l2 -> val ) { l1 -> next = mergeTwoLists ( l1 -> next , l2 ) ; return l1 ; } else { l2 -> next = mergeTwoLists ( l1 , l2 -> next ) ; return l2 ; } } } ; 结果: 来源: CSDN 作者: SuperF? 链接: https://blog.csdn.net/weixin_46338672/article/details/104825766

数据结构与算法9-排序1

北城余情 提交于 2020-03-17 22:39:49
本篇文章讲解冒泡、插入、选择排序。 1.衡量排序算法执行效率(不太用的到) 时间复杂度 时间复杂度的系数、常数、低阶 比较次数和交换(或移动)次数 2.一些前提概念 上述使用稳定排序算法的例子蛮实用的。 3.冒泡排序 平均时间复杂度呢?—— 使用有序度、逆序度 满有序度 = n*(n-1)/2 逆序度 = 满有序度 - 有序度 最坏情况的逆序度是 n*(n-1)/2,所以算平均是 n*(n-1)/4,所以平均时间复杂度为O(n^2)。 4.插入排序(就是打扑克牌,所以很常用) 上述关于逆序度的trick,了解一下即可。 5.选择排序(就是选苹果) 6.为什么插入排序更受欢迎 7.小结 8.扩展 冒泡排序 动图:https://pic1.zhimg.com/v2-1543c0b97237bb55063e033959706ca0_b.webp 插入排序 动图:https://pic2.zhimg.com/v2-f87ad7d8ad54379dd81f02fcf9b91f49_b.webp 选择排序 动图:https://pic1.zhimg.com/v2-f20b8898585b3ca03843d93ce2c35a68_b.webp 来源: CSDN 作者: Xu_Wave 链接: https://blog.csdn.net/qq_22795223/article/details

Java面试题-List集合特点

匆匆过客 提交于 2020-03-17 15:30:50
List集合特点 ArrayList: 底层数据结构是数组,查询快,增删慢。 线程不安全,效率高。 Vector: 底层数据结构是数组,查询快,增删慢。 线程安全,效率低。 LinkedList: 底层数据结构是链表,查询慢,增删快。 线程不安全,效率高。 List有三个儿子,我们到底使用谁呢? 看需求(情况)。 要安全吗? 要:Vector(即使要安全,也不用这个了,后面有替代的) 不要:ArrayList或者LinkedList 查询多:ArrayList 增删多:LinkedList 如果你什么都不懂,就用ArrayList。 来源: CSDN 作者: ginger_mr 链接: https://blog.csdn.net/qq_40332952/article/details/104877054

Yaml文件,超详细讲解

痞子三分冷 提交于 2020-03-17 14:52:20
YAML文件简单介绍 YAML 是一种可读性非常高,与程序语言数据结构非常接近。同时具备丰富的表达能力和可扩展性,并且易于使用的 数据 标记语言。 YAML全称其实是"YAML Ain't a Markup Language"(YAML不是一种标记语言)的递归缩写,所以它强调的是 数据 本身,而不是以标记为重点 为什么要使用YAML文件? 其实YAML文件也是一种配置文件,但是相较于ini,conf配置文件来说,更加的简洁,操作简单,还能存放不同类型的数据;而像ini存储的值就都是字符串类型,读取之后还要手动转换 YAML的基本语法规则 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格 。(可以将你的ide的tab按键输出替换成4个空格) 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 #表示注释 YAML支持的数据结构 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary) 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list) 纯量(scalars):单个的、不可再分的值 YAML,对象数据类型 对象的一组键值对,使用冒号结构表示。 animal: dogs 转换成Python数据结构,如下: {'animal': 'dogs'} 将所有键值对赋值。 hash: {

Redis--安装

て烟熏妆下的殇ゞ 提交于 2020-03-17 10:32:08
前戏 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。 Redis的优势 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子

MATLAB系列(一)初识

南楼画角 提交于 2020-03-17 09:56:10
文章目录 编程基础 1. 测试向量 2. 向下取整 3. 向上取整 4. 求极差 5. 符号函数 6. 魔法函数 7. rand() 函数 Tip 1. 计算结果溢出 2. MATLAB 中的 `M` 文件: 3. 矩阵点乘 4. 删除变量 5. `MATLAB 默认的数据类型为 double` 6. `不同整数类型之间不允许运算` 7. 匿名变量 8. 左除与右除 常用数据结构 —— 字符串 1. 字符串的生成 2. 字符串矩阵的生成 3. 从字符串矩阵中提取字符串 4. 字符串的执行(有疑问) 常用数据结构 —— 单元数组 常用数据结构 —— 结构体 多项式应用 1. 多项式的表示 2. 多项式的四则运算 3. 多项式的其他运算 3.1 多项式求根 roots 3.2 多项式求值 polyval 3.3 多项式求导 编程基础 1. 测试向量 2. 向下取整 比如:4.4 向下取整结果为 4 3. 向上取整 比如:4.4 向上取整结果为 5 4. 求极差 5. 符号函数 6. 魔法函数 7. rand() 函数 Tip 1. 计算结果溢出 2. MATLAB 中的 M 文件: 脚本文件 函数文件 脚本文件中的变量都为 全局变量 ,函数文件中的变量为 局部变量 3. 矩阵点乘 4. 删除变量 clear x 5. MATLAB 默认的数据类型为 double 6.

堆内存和栈内存区别

僤鯓⒐⒋嵵緔 提交于 2020-03-17 07:54:34
原帖地址:http://hi.baidu.com/passionlh/blog/item/bb3a8181d18819debd3e1e6a.html (1) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。 (2) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间! (3) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间