
算法与数据结构
文章平均质量分 95
zmrlinux
密码学 欢迎私聊一起学习
展开
-
ADT 二叉查找树
二叉查找树(排序树):定义: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;(3)左、右子树也分别为二叉排序树;一棵深度为k且有2k-1个结点的二叉树称为满二叉树。 可以对满二叉树的结点进行连续编号,约定编号从根结...原创 2017-01-22 14:05:08 · 491 阅读 · 0 评论 -
内存管理器(八)基于Glibc malloc 实现内存管理程序
前言 经历了两周多吧,总算把Glibc malloc 源码分析的文档啃完了,也算是对于malloc这个东西有深刻了解吧,毕竟自己也写了两版代码,后边还会出一个多线程版本的。就是在这个版本上修改一个支持多线程的,这个算是V2.0了。说明 前面已经阐述了malloc的分配思想,这里我接合线程池原理和边界标识法,做了这个2.0 版本。 1.最小块的大小所为40B。 2.bins 只建原创 2015-10-26 17:02:16 · 955 阅读 · 0 评论 -
内存管理器(七)Glibc malloc 实现(三)--多线程思想(先占个坑)
基本方式1.使用锁的方式来支持多线程 我们之前介绍过,库函数的实现方式是通过一个主分配区和多个非主分配区来组织的,每一个分配区中又有一个bins.我们先说对于大的分配区是如何保证线程安全的。首先,每一个分配区均有一个结构体,这个结构体中有一个线程锁和一些其他的数据结构,其中别的东西我们今天并不关心,我们只看看这个锁今天做了哪些工作。全局还有一个锁list_mutex.主要是用来同步分配区链表原创 2015-10-24 21:08:35 · 1373 阅读 · 0 评论 -
内核数据结构-----队列kfifo.h (4.0.8)较新的内核版本
比较新的内核队列源码,和2.6.X 的差别真的很大原创 2015-09-21 21:32:08 · 3896 阅读 · 0 评论 -
内存管理器(六)Glibc malloc 实现(二)--设计模式
ptmalloc 的设计模式原创 2015-10-21 21:51:42 · 855 阅读 · 0 评论 -
内存管理器(五)Glibc malloc实现(一)(概论)
系统malloc实现前言之前,我们了解了下边界表识法,以及伙伴算法,并且简单实现了,mallc /free 库函数。 为了探究操作系统到底如何分配释放内存,我们开始研究下glibc 的实现。内存管理内存管理一般分三个层面: 1.用户管理 2.C运行时库的管理 3.操作系统层管理原创 2015-10-19 18:22:25 · 876 阅读 · 0 评论 -
内存管理器(三)使用边界标识法实现内存分配器
使用边界标识法实现简单分配器前言前一篇我们已经了解了边界标识算法和数据结构,其实边界标识法还是比较复杂的,它的难点在于对C的使用的淋漓尽致,以及复杂的逻辑关系。所以我们还需要多思考,多体会才能领悟个中精髓,其实我昨天在学习那个小例子的时候由一瞬间感觉如果用C++实现可能更方便,所以再此决定等这几篇完成,就使用C++实现一个小小的实例。 言归正传,我们今天需要看一个用C使用边界标识法实现的简单分配器原创 2015-10-16 17:29:54 · 2401 阅读 · 0 评论 -
内存管理器(四) 伙伴算法及分配器原理实现
内存管理器(四) 伙伴算法前言上两篇一共介绍了边界标识算法,以及使用边界标识算法实现了一个堆内存的分配器,现在我们学习下另一种内存管理的算法,我们的Linux的内存管理就广泛应用了伙伴算法。非话不多说。__START这个算法是什么?伙伴算法:伙伴算法(系统)是操作系统中用到的另一种动态存储管理方法。它和边界标识法类似。在用户提出申请时,分配一块恰当的内存区域给用户;原创 2015-10-17 22:35:29 · 1852 阅读 · 0 评论 -
list.h 解析
内核数据结构list.h 解析首先这个数据结构不同于我们我们设计的链表结构。其实链表这种结构的各种操作就是改变链表的指针域而已,所以可以发现内核的链表结构在设计的时候其实只有指针域。我的内核版本: 4.0.8-200.fc21.x86_6 此篇博客所有的源码都来自这个版本的内核。节点的定义在./include/types.h 中 struct list_head {原创 2015-09-09 20:45:22 · 617 阅读 · 0 评论 -
散列表
散列表 前几天看《linux内核设计与实现》的时候,发现一个新名词(对于我来说)“散列表”,直接给我看蒙住了,散列表是个什么鬼,于是今天晚上找了本数据结构的书,来学习下散列表这个新东西。 散列表: 既是一种存储的技术,又是一种查找的技术,也就是说可以用它来查找与存储,不同于一般的存储与查找,一般正常的存储,举个例子一个已经存在的数组,其中原创 2015-06-16 21:24:28 · 652 阅读 · 0 评论 -
初探二叉树
数据结构之初探二叉树 树的一些基本概念: 树:N个节点组成的有限集合(N>=0)。 子树:上一个根节点的孩子,并且也是下一层子树的根节点。 二叉树:最多只有两个孩子节点的树。 空树:没有子节点的树。 非空树:原创 2015-05-12 21:24:14 · 642 阅读 · 0 评论 -
初探几种排序算法
多种排序算法的总结(不包括复杂度的详细推算)稳定排序与不稳定排序 稳定排序:相同元素在排序中的相对位置不改变。 不稳定排序:相同元素在排序中的相对位置改变。内部排序与外部排序:内部排序:待排的记录与内容都放在计算机的随机存储器中进行的排序过程外部排序:一般指待排序记录的数量很大,以致内存中一次不能完全容纳全部的记录,在排序过程中,需要对外存进行访问的排序过程。排原创 2015-05-11 07:53:31 · 1110 阅读 · 0 评论 -
用两个栈实现一个队列
使用两个栈实现一个队列原创 2015-04-24 20:26:14 · 549 阅读 · 0 评论 -
数据结构之栈与队列
数据结构之栈与队列数据结构的有一个重要结构栈,栈这种数据结构就是满足先进后出的这种规则的数据结构就是栈,引用《大话数据结构》中的一个形象例子就是,子弹的弹夹,最先压入弹夹的子弹最后一个出弹夹,正好往一个栈里添加一个元素叫压栈、入栈,从栈里出来一个元素叫弹栈,出栈。指示器就叫栈帧。栈图原创 2015-04-21 19:06:33 · 828 阅读 · 0 评论 -
数据结构之链表
数据结构之链表 数据结构的第一章就是链表,链表是其他结构的基础,包括栈,树等等,链表由节点组成,其中在最前边有头指针和头结点组成其中,头指针是一个链表必要的元素,头结点可以使链表更为同一,但是头结点并非是一个链表的必要的元素。现在以一个结构体为一个节点,一个节点包含数据域,指针域两个部分,数据域用来存储需要存储的内容,指针域存储下一个结构体的地址。typedef struct原创 2015-04-14 23:21:18 · 543 阅读 · 0 评论 -
基础算法之简单递归
递归算法简单来说就是把问题规模缩小然后递归调用。其中有三个经典例题,汉诺塔,阶乘,与斐波那契数列。这里只写一个阶乘的例子,递归调用还会在以后详细讨论。#includeint iJiecheng(int a);int main(){int a;int b;printf("please enter a number:");scanf("%d",&a);b=iJiec原创 2015-03-27 23:15:07 · 473 阅读 · 0 评论 -
算法基础——冒泡与选择排序
冒泡排序: 一种交换排序,两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。 例如4个数排序 #includeint main(){int ar[5];int temp;int i,j;for(i=0;i{scanf("%d",&ar[i]);}for(i=0;ifor(j=0;j{if(ar[j]>a原创 2015-03-25 23:05:29 · 362 阅读 · 0 评论