摘要: 前言背包问题是一个经典的算法问题,可以用动态规划,贪心法,分支界限法等方法解决问题描述:有n个物品,编号1,2,3,、、n,其中第 i 个物品重量为Wi 价值 Vi ,有一个容量为W的背包。在容量允许范围内,如何选择物品,可以得到最大的价值。(为了简单起见,假设物品的重量 Wi 和价值Vi 都是正数)根据取物品的方式,背包问题又可以被分为三类:0/1背包问题(0-1 knapsack problem)这也是最常见的背包问题,对于每个物品,要么取走要么不取走,每个物品只能取一次。可以用数学表达式表示为:maximize subject to其中xi只能为1 或者0 所以称为背包问题有界限的背包问 阅读全文
posted @ 2011-12-25 22:33 Geek_Ling 阅读(17978) 评论(0) 推荐(4) 编辑
摘要: 初衷这个学期开了算法课,要几个关键算法思想的代码实现。当时感觉学的还可以了,也做了认真的笔记。真正写代码的时候发现还是没有完全掌握。网上关于这方面的资料也零零散散不是很全,致使走了不少弯路。今晚上实验成功验收了,感觉自己也收获不小遂决定把算法实现的详细思路记录下来,一是自己坐下总结、另外也希望给当时想我一样找资料、搞算法的同学一些帮助。这中间我会尽最大可能的把问题描述清楚。这篇博文主要写的是n皇后问题、后续还会加上背包问题(动态规划和分支界限)、旅行商问题等等。写在前面不管什么问题、都是可以抽象的,对于任何问题,你总是可以找到几个point,它们对问题全局有着决定性的作用,弄清楚看他们之间的内 阅读全文
posted @ 2011-12-19 10:51 Geek_Ling 阅读(20109) 评论(1) 推荐(3) 编辑
摘要: 前言:在程序设计的时候、堆栈总是不可避免的会接触到、而对于堆和栈他们的区别、在程序运行时各自的作用,如何利用堆栈提高运行效率等很多人都还了解的不够,今天google了很多文章,所以在这里作个完善总结,希望能给有心人些帮助。有不足的地方还希望能指出。栈是随函数被调用时分配的空间 栈上分配的空间是临时的,在函数退出后将被系统释放,不会造成内存泄露,不得用delete或free操作,因为栈的空间小所以在栈上不能获得大量的内存块,一般最大也就不到10M堆是在整个进程的未分配空间中分配的内存,由malloc或new分配,一般必须由free或delete释放。堆上可以分配大量的内存,只要你的机器吃得消。. 阅读全文
posted @ 2011-12-10 14:34 Geek_Ling 阅读(12180) 评论(3) 推荐(4) 编辑
摘要: 最近写了几篇深层次讨论数组和指针的文章,其中提到了“C语言中,所有非数组的形式参数传递均以值传递形式”数组和指针背后——内存角度语义"陷阱"---数组和指针而关于值传递,指针传递,引用传递这几个方面还会存在误区, 所有我觉的有必要在这里也说明一下~下文会通过例子详细说明哦值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。指针传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作引 阅读全文
posted @ 2011-12-07 11:18 Geek_Ling 阅读(165840) 评论(9) 推荐(31) 编辑
摘要: 上一篇《语义陷阱-数组和指针》聊过数组和指针的区别,主要是对于数组和指针在内存中的访问方式加以区分,这篇博文则从更深层的角度剖析数组和指针的联系如果你也对底层感兴趣、我向这篇文章会对你有所帮助,什么时候数组和指针相同(When an Array Is a Pointer )在实际应用中,他们可以互换的情形要大大多于不能互换的情形。首先再回顾一下声明和定义,(上一篇中有提到这里在深入一下)声明本身还可以进一步分为三种情况:1)外部数组的声明(external array)2)数组的定义(它是声明的一种特殊情况,它分配内存空间,并可能提供一个初值)3)函数参数的声明所有作为函数参数的声明在编译时总 阅读全文
posted @ 2011-12-06 12:37 Geek_Ling 阅读(8558) 评论(4) 推荐(7) 编辑
摘要: 数组和指针经常出现于编程语言中、也许上课的时候老师也说过数组和指针有区别、参考书上也应该讲过,你是不是也不曾透彻的理清过?这篇博文主要从内存和编译的角度指出了数组和指针在访问方式上的区别、至于他们在函数调用的区别、以及它们的联系将在下一篇中详细讨论。为了说的清楚些、会先说一些基础的部分、如果你已经掌握大可跳过What's a Declaration? What's a Definition?声明和定义c语言的对象必须有且只有一个定义,但可以有多个声明(extern)这里说的对象和面向对象中的对象没有关系。A definition is the special kind of d 阅读全文
posted @ 2011-11-29 22:55 Geek_Ling 阅读(4931) 评论(4) 推荐(4) 编辑
摘要: 这篇博文主要内容是程序运行时的数据结构,包括运行时程序中的不同部分如何分配内存、函数调用的内存实现、还介绍了一个c独有的强大功能,一个被称为“展开堆栈”(unwinding stack)的技术运行时 数据结构,中间的空格是特意留出的,运行时可以认为是程序执行的一个状态,一般有编译时,运行时等,他们都是表示一个处理状态。编程语言的的经典对立之一就是代码和数据的区别。代码和数据的区别也可认为是运行时和编译时的界限,编译器的绝大部分工作和翻译代码有关;必要的数据存储管理的绝大部分都在运行时进行。如果你用过GCC,就会知道用GCC编译程序,都会得到一个默认名为“a.out”的文件。简单说下“a.out 阅读全文
posted @ 2011-11-28 11:19 Geek_Ling 阅读(9074) 评论(1) 推荐(4) 编辑
摘要: 引言:写一段程序很容易、也能很容易的得到一个能正确运行的执行、学习语言很容易,难的是掌握它不管接触什么语言,最经典的入门例子大概就是“hello world”了。然而,对于“hello world”背后的东西、当时却不曾深究。作为做程序的普通小菜、我仍醉心于基础和底层的东西。诚然、我也认为这些东西很重要。练好“内功”、有扎实的底层基础才能走的更快更远。知其所以然:承上、今天看了一下关于编译过程中链接的部分、觉得很有价值遂分享如下。由于链接器是从编译器中分割出来的单独程序,所以先要对编译有一个基本的认识。编译器的基本概念:简单的说,一个编译器就是一个程序,它可以阅读某一种程序语言编写的程序,并把 阅读全文
posted @ 2011-11-24 19:57 Geek_Ling 阅读(2176) 评论(5) 推荐(3) 编辑
摘要: 开篇今天,计算机系统结构的真正挑战不在于内存的容量,而是内存的速度。如果你的软件实际上受到磁盘和内存的等待时间(访问时间)的限制,那么就是再好的芯片也无济于事。在内存和cpu之间存在着一道很深的鸿沟,而且是越来越深。在过去,每隔一两年,cpu的处理速度就会提升一倍,在相同的时间内,内存的容量倒是扩大了一倍,但它的访问时间提升却没有那么明显。。所以我的理解是:内存主要受限于容量和速度。容量问题除了集成工艺的发展扩大物理内存容量,还可用用虚拟内存的办法解决。访问速度则可通过Cache技术的发展和程序设计的优化。内存管理的前世今生最初的计算机使用的内存直接对物理内存进行访问。这样的方式很快就被淘汰, 阅读全文
posted @ 2011-11-19 17:14 Geek_Ling 阅读(3474) 评论(8) 推荐(4) 编辑
摘要: 初衷:最近在看算法相关的东西,看到贪心法解决mst的问题,可惜树上讲解的不是很清新,到网上找了很多资料讲解的也不透彻只是随便带过就草草了事、这几天抽空看了下,总算基本思路理清楚了主要还是得感谢强大的google,帮我找到一个很好的英文资料。(下面有链接,有兴趣的同学可以看看)理顺了思路,就和大家分享下~希望对学习贪心法的同学会有所帮助。这篇博客的主要内容是贪心法求解Minimum Spanning Tree (MST)(最小生成树)的问题贪心法求解最小生成树常用的有两种算法,分别是Prim’s MST algorithm和Kruskal's MST algorithm(prim算法和k 阅读全文
posted @ 2011-11-16 20:19 Geek_Ling 阅读(18929) 评论(5) 推荐(1) 编辑