12 2011 档案
摘要:开篇死锁是操作系统中的重要概念,和操作系统中的其他重要概念一样,对它的正确理解将帮助你写出更加高效、优秀的程序。这里没有晦涩的定义,只有易懂的描述和生动的例子。相信你看了之后会有所收获。什么是死锁简单的说,死锁就是电脑里的硬件资源或者软件资源不够用了。为什么会有这种情况呢?比如说A占有资源m,请求资源n。B占有资源n请求资源m。进程A和B都会因为请求不到自己的资源而睡眠。下面将进一步介绍。更形象的描述-死锁建模:为了能对死锁进行更好的分析,我们为死锁建模。就是用一个有向图来表示进程和资源的使用情况,圆形节点表示进程,方形节点表示资源。资源指向进程的边表示该进程占有该资源,进程指向资源表示进程请
阅读全文
摘要:图是一种常见的数据结构,深度优先和广度优先搜索都是常用的算法,这篇博文先介绍深度优先搜索。和往常一样的,我会用朴实的语言来介绍它,所以只要认真看一定能理解。开始会先介绍下图的表示方法,如果已经掌握了大可跳过。图的表示要表示一个图G(V,E)有两种常见的表示方法,邻接矩阵和邻接表。这两种方法可用于有向图和无向图。对于稀疏图,常用邻接表表示,它占用的空间|E|要小于|V|*|V|。邻接表:图G(V,E)的邻接表表示由一个包含V列表的数组Adj组成,其中的每个列表对应于V中的一个顶点,对于v中的任意一个点u,灵界表Adj[u]包含所有满足条件(u,v)属于E的点v,也就是Adj[u]中包含所有和u相
阅读全文
摘要:前言背包问题是一个经典的算法问题,可以用动态规划,贪心法,分支界限法等方法解决问题描述:有n个物品,编号1,2,3,、、n,其中第 i 个物品重量为Wi 价值 Vi ,有一个容量为W的背包。在容量允许范围内,如何选择物品,可以得到最大的价值。(为了简单起见,假设物品的重量 Wi 和价值Vi 都是正数)根据取物品的方式,背包问题又可以被分为三类:0/1背包问题(0-1 knapsack problem)这也是最常见的背包问题,对于每个物品,要么取走要么不取走,每个物品只能取一次。可以用数学表达式表示为:maximize subject to其中xi只能为1 或者0 所以称为背包问题有界限的背包问
阅读全文
摘要:初衷这个学期开了算法课,要几个关键算法思想的代码实现。当时感觉学的还可以了,也做了认真的笔记。真正写代码的时候发现还是没有完全掌握。网上关于这方面的资料也零零散散不是很全,致使走了不少弯路。今晚上实验成功验收了,感觉自己也收获不小遂决定把算法实现的详细思路记录下来,一是自己坐下总结、另外也希望给当时想我一样找资料、搞算法的同学一些帮助。这中间我会尽最大可能的把问题描述清楚。这篇博文主要写的是n皇后问题、后续还会加上背包问题(动态规划和分支界限)、旅行商问题等等。写在前面不管什么问题、都是可以抽象的,对于任何问题,你总是可以找到几个point,它们对问题全局有着决定性的作用,弄清楚看他们之间的内
阅读全文
摘要:前言:在程序设计的时候、堆栈总是不可避免的会接触到、而对于堆和栈他们的区别、在程序运行时各自的作用,如何利用堆栈提高运行效率等很多人都还了解的不够,今天google了很多文章,所以在这里作个完善总结,希望能给有心人些帮助。有不足的地方还希望能指出。栈是随函数被调用时分配的空间 栈上分配的空间是临时的,在函数退出后将被系统释放,不会造成内存泄露,不得用delete或free操作,因为栈的空间小所以在栈上不能获得大量的内存块,一般最大也就不到10M堆是在整个进程的未分配空间中分配的内存,由malloc或new分配,一般必须由free或delete释放。堆上可以分配大量的内存,只要你的机器吃得消。.
阅读全文
摘要:最近写了几篇深层次讨论数组和指针的文章,其中提到了“C语言中,所有非数组的形式参数传递均以值传递形式”数组和指针背后——内存角度语义"陷阱"---数组和指针而关于值传递,指针传递,引用传递这几个方面还会存在误区, 所有我觉的有必要在这里也说明一下~下文会通过例子详细说明哦值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。指针传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作引
阅读全文
摘要:上一篇《语义陷阱-数组和指针》聊过数组和指针的区别,主要是对于数组和指针在内存中的访问方式加以区分,这篇博文则从更深层的角度剖析数组和指针的联系如果你也对底层感兴趣、我向这篇文章会对你有所帮助,什么时候数组和指针相同(When an Array Is a Pointer )在实际应用中,他们可以互换的情形要大大多于不能互换的情形。首先再回顾一下声明和定义,(上一篇中有提到这里在深入一下)声明本身还可以进一步分为三种情况:1)外部数组的声明(external array)2)数组的定义(它是声明的一种特殊情况,它分配内存空间,并可能提供一个初值)3)函数参数的声明所有作为函数参数的声明在编译时总
阅读全文