以图明志

计算机算法

整数拆分的动态规划解法

其实也可以用背包来解决
输入n,和k,问将n用1到k这k个数字进行拆分,有多少种拆分方法。例如:n=5,k=3 则有n=3+2, n=3+1+1, n=2+1+1+1, n=2+2+1, n=1+1+1+1+1这5种拆分方法。这个题目是个比较明显的动态规划,如果想不到是背包问题,也可以写出状态转移方程如下。

计算机算法

图解插入排序算法

深入研究插入排序的实现
插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。

计算机算法

深入探讨各种背包算法问题

背包问题介绍与分析
背包问题是在1978年由Merkel和Hellman提出的。它的主要思路是假定某人拥有大量物品,重量各不同。此人通过秘密地选择一部分物品并将它们放 到背包中来加密消息。背包中的物品中重量是公开的,所有可能的物品也是公开的,但背包中的物品是保密的。附加一定的限制条件,给出重量,而要列出可能的物品,在计算上是不可实现的。

编程思想

函数要尽量设计得短小精悍

小函数之道
“设计良好的函数往往比较小,而过大函数的设计往往一塌糊涂,或者存在很大的优化空间。”也许你认为讨论函数的大小没有必要,原因是函数设计的本质是内聚,它的大小只是它的表现形式。而上面的原因有必要让我们讨论一下函数的大小问题。我对函数的核心思路:我提出代码最小处理单元的概念:一个基本操作(赋值,比较等),一个函数调用(包括调用后判断返回值进行判断)都看成一个最小处理单元。

数据结构

几个链表逆序的实现方法

常规实现与递归实现
链表逆序就是把一个链表按照原来的链接顺序逆序实现(也就是将头变成尾,尾变成头)。编程思路:其实最关键的是先通过原来的链接顺序找到下个节点,然后再把前个节点反序。

编程思想

关于设计模式的一些看法与思考

《design pattern explained》
最近看完了《design pattern explained》,本打算单单的从技术角度进行总结的,但是却全然没有头绪。说说自己的粗浅的感悟吧。书里没有把23中设计模式全部罗列出来,摆上类图和源代码,恩,这样的做法在作者看来很傻。作者说,将目标集中在设计模式解决问题本身上“only tells us what to do but not when to use and why to do it”。是的,我们需要的应该是思考的过程和方法,而不是前人留给我们的思考结果。

数据结构

为什么计算机要采用二进制

而不是八进制或者十六进制
电子计算机能以极高速度进行信息处理和加工,包括数据处理和加工,而且有极大的信息存储能力。数据在计算机中以器件的物理状态表示,采用二进制数字系统,计算机处理所有的字符或符号也要用二进制编码来表示。用二进制的优点是容易表示,运算规则简单,节省设备。人们知道,具有两种稳定状态的元件(如晶体管的导通和截止,继电器的接通和断开,电脉冲电平的高低等)容易找到,而要找到具有10种稳定状态的元件来对应十进制的10个数就困难了。

编程思想

敏捷开发需要了解的一些规则

4条核心价值观与12条敏捷软件开发的规则
敏捷开发,Agile Development,就是指能够在需求迅速变化的情况下快速开发软件。我们接触最多的和敏捷相关的名词是:极限编程(XP)、结对编程、测试驱动开发(TDD)等。追究敏捷的历史,就必须要提到著名的敏捷开发宣言,2001年,17位业界专家(其中包括我们非常熟悉的Martin, Martin Fowler)组成了一个敏捷联盟。

计算机算法

只有10%的程序员可以把二分查找写正确

直到1962年才有没bug的二分查找
二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它。一开始,范围覆盖整个数组。将数组的中间项与T进行比较,可以排除一半元素,范围缩小一半。就这样反复比较,反复缩小范围,最终就会在数组中找到T,或者确定原以为T所在的范围实际为空。

计算机算法

哥德巴赫猜想的程序验证

任何一个充分大的偶数都可以表示为两个素数之和
Timus Online Judge 网站上有这么一道题目:1356. Something Easier。这道题目的输入是一组 2 到 109 之间整数,对于每个输入的整数,要求用最少个数的素数的和来表示。这道题目的时间限制是 1 秒。我们知道著名的哥德巴赫猜想是:任何一个充分大的偶数都可以表示为两个素数之和。

数据结构

简单通俗地理解Hash哈希存储

理解Hash的妙处
先来了解一下Hash的基本思路:设要存储对象的个数为num, 那么我们就用len个内存单元来存储它们(len>=num); 以每个对象ki的关键字为自变量,用一个函数h(ki)来映射出ki的内存地址,也就是ki的下标,将ki对象的元素内容全部存入这个地址中就行了。这个就是Hash的基本思路。

数据结构

非常直观的数据结构与算法演示

更加明晰清楚地了解数据结构
在网上看到了一个旧金山大学David Galles做的各种可视化的数据结构和基本算法的主页,网址在这里,大家可以看看。我把这个页面的目录列在下面并翻译了一下,大家可以直接点击了。比如Stack栈: 数组实现,Stack栈: 链表实现,Queues队列: 数组实现,Queues队列: 链表实现,Lists列表: 数组实现。

编程思想

程序数据存储在什么地方

程序员的基本知识
程序运行时,我们最好对数据存储到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以存储数据:Registers 寄存器这是速度最快的存储场所,因为寄存器其他所有存储媒介都不同:它位于处理器内部。不过,寄存器的数量十分有限,所以寄存器是根据需要由编译器适当地分配。

编程思想

编程高手与调试高手

两者关系密不可分
业界总是有高手之说,高手成了程序员心中之偶像,成了程序员成长之目标。但是,现实中人们往往对自己所了解的程序员,很难认同为高手;人们反而对那些自己不了解的,甚至是道听途说的人会认作为高手了。高手,同武林高手一样,神秘之至。

编程思想

程序代码注释的规范与建议

你的代码注释到位了吗?
对每一级用统一的方法注释每个代码块,例如:为每个类,包含简短的描述,作者和最后修改日期为每个方法,包含其目的,功能,参数,返回值团队编程时,采用标准的注释是很重要的。当然,采用代码协定和工具(比如c#中的XML和java中的Javadoc)帮助这项工作也是可接受的,甚至更可取。

编程思想

实现一个自动垃圾回收的思路

自动内存管理的策略,这就是自动垃圾回收机制
显式的内存管理的复杂性,而且还容易出错。因此我们需要一种自动内存管理的策略,这就是自动垃圾回收机制。既然是自动垃圾回收,那么平台肯定得采取一种方式发现垃圾,然后清除。这就是垃圾收集算法所关注的问题。垃圾收集算法的任务就是将活动的对象和已经死掉的对象分别出来,然后将死掉的对象的内存回收,而且为了更好的利用内存。
18 / 22 首页 < Prev 16 17 18 19 20 Next > 尾页 页码: