linux2.4.0内存管理mmap_avl.c的一些思考记录

原创 2012年03月22日 16:11:36

学校开的数据结构讲过AVL算法,我以为我看这个avl_rebalance会比较轻松,看了几十分钟后看得一头雾水,这个算法和数据结构课写的那个算法几乎完全不一样,数据结构用的是递归算法,而这里用栈和循环代替递归(显然linux这样干更高效),我发现这点后,以为看懂了,接着看下去发现我又想错了,《数据结构c描述版》是用平衡因子取值(2,  1, 0 -1 , -2),而linux取的是左右子树最高的子树的高度加上1,叶子height = 1。通过对比高度大小情况判断左右子树是否平衡。

如果有人看mmap_avl.c看到有问题而找到这篇文章,希望我上面很小一段的解释能给你些指引,然后通过自己的思考看明白这个算法。

《数据结构c描述版》的AVL算法可以看下面,一位网友写的代码:


http://blog.csdn.net/liuzongqiang/article/details/2049935



mmap_avl.c avl_rebalance函数代码:

/*
 * Rebalance a tree.
 * After inserting or deleting a node of a tree we have a sequence of subtrees
 * nodes[0]..nodes[k-1] such that
 * nodes[0] is the root and nodes[i+1] = nodes[i]->{vm_avl_left|vm_avl_right}.
 */
static void avl_rebalance (struct vm_area_struct *** nodeplaces_ptr, int count)
{
    for ( ; count > 0 ; count--) {
        struct vm_area_struct ** nodeplace = *--nodeplaces_ptr;
        struct vm_area_struct * node = *nodeplace;
        struct vm_area_struct * nodeleft = node->vm_avl_left;
        struct vm_area_struct * noderight = node->vm_avl_right;
        int heightleft = heightof(nodeleft);
        int heightright = heightof(noderight);
        if (heightright + 1 < heightleft) {
            /*                                                      */
            /*                            *                         */
            /*                          /   \                       */
            /*                       n+2      n                     */
            /*                                                      */
            struct vm_area_struct * nodeleftleft = nodeleft->vm_avl_left;
            struct vm_area_struct * nodeleftright = nodeleft->vm_avl_right;
            int heightleftright = heightof(nodeleftright);
            if (heightof(nodeleftleft) >= heightleftright) {
                /*                                                        */
                /*                *                    n+2|n+3            */
                /*              /   \                  /    \             */
                /*           n+2      n      -->      /   n+1|n+2         */
                /*           / \                      |    /    \         */
                /*         n+1 n|n+1                 n+1  n|n+1  n        */
                /*                                                        */
                node->vm_avl_left = nodeleftright; nodeleft->vm_avl_right = node;
                nodeleft->vm_avl_height = 1 + (node->vm_avl_height = 1 + heightleftright);
                *nodeplace = nodeleft;
            } else {
                /*                                                        */
                /*                *                     n+2               */
                /*              /   \                 /     \             */
                /*           n+2      n      -->    n+1     n+1           */
                /*           / \                    / \     / \           */
                /*          n  n+1                 n   L   R   n          */
                /*             / \                                        */
                /*            L   R                                       */
                /*                                                        */
                nodeleft->vm_avl_right = nodeleftright->vm_avl_left;
                node->vm_avl_left = nodeleftright->vm_avl_right;
                nodeleftright->vm_avl_left = nodeleft;
                nodeleftright->vm_avl_right = node;
                nodeleft->vm_avl_height = node->vm_avl_height = heightleftright;
                nodeleftright->vm_avl_height = heightleft;
                *nodeplace = nodeleftright;
            }
        }
        else if (heightleft + 1 < heightright) {
            /* similar to the above, just interchange 'left' <--> 'right' */
            struct vm_area_struct * noderightright = noderight->vm_avl_right;
            struct vm_area_struct * noderightleft = noderight->vm_avl_left;
            int heightrightleft = heightof(noderightleft);
            if (heightof(noderightright) >= heightrightleft) {
                node->vm_avl_right = noderightleft; noderight->vm_avl_left = node;
                noderight->vm_avl_height = 1 + (node->vm_avl_height = 1 + heightrightleft);
                *nodeplace = noderight;
            } else {
                noderight->vm_avl_left = noderightleft->vm_avl_right;
                node->vm_avl_right = noderightleft->vm_avl_left;
                noderightleft->vm_avl_right = noderight;
                noderightleft->vm_avl_left = node;
                noderight->vm_avl_height = node->vm_avl_height = heightrightleft;
                noderightleft->vm_avl_height = heightright;
                *nodeplace = noderightleft;
            }
        }
        else {
            int height = (heightleft<heightright ? heightright : heightleft) + 1;
            if (height == node->vm_avl_height)
                break;
            node->vm_avl_height = height;
        }
    }
}


叔本华系列之(一)论独立的思考

即使是藏书最为丰富的图书馆,如果里面的书籍胡乱摆放,那么它的实际用处还不如一个收藏不多、但却整理得井井有条的小图书室。同样道理,如果大量的知识没有经过自己细心地思考加工,那么它的价值也远远逊色于数量较...
  • c_trekman
  • c_trekman
  • 2016年11月26日 14:55
  • 190

JMeter学习笔记21-如何添加思考时间

本文来介绍,JMeter如何插入思考时间。前面介绍过一个真实的性能测试场景,是需要加入思考时间,来模拟真实用户行为。本文就来介绍,如何在三个请求之间添加思考时间。 1. 在Test Plan下新建一...
  • u011541946
  • u011541946
  • 2017年05月05日 16:13
  • 2490

关于对记录的思考

从大学一直以来都有那种很深的困惑:
  • bsxq2815
  • bsxq2815
  • 2014年07月16日 13:06
  • 307

《清醒思考的艺术》读后感

咱们大部分人都是普通人,一些常见的思维漏洞我们也不免存在,这本书讲了50多种常见的常见的思维习惯并有小故事帮助我们理解这些习惯中的漏洞,让我们对事物有更加清楚的认识。 一、幸存偏误 概念:由于日常...
  • HEJI1103
  • HEJI1103
  • 2016年07月05日 18:52
  • 1642

读书笔记:逆向思考的艺术

这本书的作者是Humphrey B. Neill,本来想查一下wiki看看这个人的介绍,居然没查到。逆向思考可以简单表述为:不落他人窠臼,相信自己的想法,思考问题的时候要尽量做到特立独行,避免思想的雷...
  • carolzhang8406
  • carolzhang8406
  • 2015年06月01日 10:45
  • 1039

LoadRunner性能测试-思考时间

LoadRunner思考时间  一、virtual user generator(脚本录制与设置)        1、在录制脚本的时候LoadRunner会自动记录录制者在录制软件系统...
  • liuyuzhu111
  • liuyuzhu111
  • 2015年11月12日 19:38
  • 1196

读《面向对象的思考过程》作者matt Weisfeld

最近接触了很多java代码,开始于机缘巧合,读了《java编程思想》的大概前四分之一,这比我读《C++primer》还要多了,两本都是大部头,我能完整读完还需毅力。惊讶于两门语言语法非常的相似,之前对...
  • czl389
  • czl389
  • 2017年02月22日 11:36
  • 1000

对于人工智能的思考

这些天来被AlphaGo和李世石的"世纪人机大战"刷屏,由此引出的对人工智能好坏的思考成为人们以及媒体谈论的焦点,一说人工智能将会服务人类,战胜李世石是计算机史上的里程碑事件,又一说自学习人工智能将会...
  • u010168422
  • u010168422
  • 2016年03月19日 15:45
  • 384

线性模型(二)--对线性回归的几点思考

上一节我们推导了线性回归求解参数的过程,然而仅仅掌握理论推导是远远不够的,还需要理解模型的意义。本节主要讨论线性回归与广义线性模型的关系以及线性回归损失函数的意义。 我们假设,则有 ...
  • Fleurdalis
  • Fleurdalis
  • 2017年02月09日 19:25
  • 532

像计算机科学家一样思考Python pdf

下载地址:网盘下载 内容简介  · · · · · · 《像计算机科学家一样思考python》按照培养读者像计算机科学家一样的思维方式的思路来教授python语言编程。全书贯穿的主体...
  • cf406061841
  • cf406061841
  • 2017年07月21日 23:15
  • 637
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux2.4.0内存管理mmap_avl.c的一些思考记录
举报原因:
原因补充:

(最多只允许输入30个字)