上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 21 下一页
摘要: 本文介绍从无序数组中选择最大值和最小值的最优算法。进而介绍采用快速排序思想的 RANDOMIZED-SELECT 选择算法来查找给定位置 i 的值,或获取中位数(median)。快速排序会递归地处理划分的两边,而 RANDOMIZED-SELECT 则只处理一边。所以快速排序的期望运行时间是 Θ(n lg n),而 RANDOMIZED-SELECT 的期望运行时间为 Θ(n)。 阅读全文
posted @ 2014-07-23 22:42 sangmado 阅读(7448) 评论(1) 推荐(0) 编辑
摘要: 任意一个比较排序算法在最坏情况下,都需要做 Ω(n lg n) 次的比较,堆排序和合并排序都是渐进最优的比较排序算法。本文介绍三种以线性时间运行的算法:计数排序、基数排序和桶排序,这些算法都用非比较的一些操作来确定排序顺序。因此,下界 Ω(n lg n) 对它们是不适用的。 阅读全文
posted @ 2014-07-14 13:17 sangmado 阅读(6808) 评论(5) 推荐(4) 编辑
摘要: 比较排序(Comparison Sort)通过对数组中的元素进行比较来实现排序。本文介绍常见的比较排序算法,包括插入排序(Insertion Sort)、希尔排序(Shell Sort)、快速排序(Quicksort)、冒泡排序(Bubble Sort)、鸡尾酒排序(Cocktail Sort)、奇偶排序(Odd-Even Sort)、选择排序(Selection Sort)、堆排序(Heap Sort)、合并排序(Merge Sort)、内省排序(Introspective Sort)等。 阅读全文
posted @ 2014-07-14 02:59 sangmado 阅读(32061) 评论(11) 推荐(41) 编辑
摘要: 如果说数组(Array)是以线性的方式存储数据,那么可以将二叉树(Binary Tree)想象成以非线性二维的方式存储数据。二叉查找树(BST : Binary Search Tree)规定了树节点排列的一些规则,以保证它的查找时间要低于数组的线性查找时间。BST 算法查找时间依赖于树的拓扑结构,最佳情况是 O(log­2n),而最坏情况是 O(n)。 阅读全文
posted @ 2014-07-03 08:55 sangmado 阅读(56868) 评论(25) 推荐(31) 编辑
摘要: 本文将介绍一些计算机程序设计中常用数据结构,包括 Array, Linked List, List, HashTable, Stack, Queue, Dictionary 等。并同时介绍关于这些基本数据结构内部实现原理和常用操作的复杂度,以及如何选择使用合适的数据结构。 阅读全文
posted @ 2014-06-29 08:16 sangmado 阅读(54719) 评论(89) 推荐(268) 编辑
摘要: 对于同一计算问题可以用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑。对于一个算法,当输入规模大到使只与运行时间的增加量级有关时,就是在研究算法的渐进效率。也就是说,从极限角度看,我们只关心算法运行时间如何随着输入规模的无限增长而增长。 阅读全文
posted @ 2014-06-28 16:44 sangmado 阅读(59137) 评论(21) 推荐(84) 编辑
摘要: 最少知识原则(Least Knowledge Principle),或者称迪米特法则(Law of Demeter),是一种面向对象程序设计的指导原则,它描述了一种保持代码松耦合的策略。其可简单的归纳为:"Each unit should have only limited knowledge about other units: only units "closely" related to the current unit. 每个单元对其他单元只拥有有限的知识,只了解与当前单元紧密联系的单元;",简洁的说是:”Only talk to your immediate friends. 只和自己直接的 "朋友" 交谈。”。 阅读全文
posted @ 2014-06-23 08:25 sangmado 阅读(10891) 评论(10) 推荐(9) 编辑
摘要: 接口分离原则(The Interface Segregation Principle)表述为“客户类不应被强迫依赖那些它们不需要的接口。(Clients should not be forced to depend upon interfaces that they do not use.)”。本篇文章中,我们探讨了关于胖接口 "fat interface" 所带来的问题,也就是接口不是为特定的客户类服务,而服务了多个不同的客户类。胖接口使本应该被隔离的客户类之间产生了耦合。通过应用 Adapter 设计模式,采用委托(delegation)或多继承方式,胖接口可以被分离成多个抽象的基类接口,从而打破客户类之间的不必要的耦合。 阅读全文
posted @ 2014-06-20 08:09 sangmado 阅读(13076) 评论(4) 推荐(8) 编辑
摘要: 依赖倒置原则(The Dependency Inversion Principle)可表述为 “高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于具体实现细节,而具体实现细节应该依赖于抽象。(A. High level modules should not depend upon low level modules. Both should depend upon abstractions. B.Abstractions should not depend upon details. Details should depend upon abstraction.)”。DIP 是很多面向对象技术的根基。它特别适合应用于构建可复用的软件框架。其对于构建弹性地易于变化的代码也特别重要。并且,因为抽象和细节已经彼此隔离,代码也变得更易维护。 阅读全文
posted @ 2014-06-19 11:25 sangmado 阅读(9987) 评论(3) 推荐(6) 编辑
摘要: 里氏替换原则(Liskov Substitution Principle)表述为 "使用基类对象指针或引用的函数必须能够在不了解衍生类的条件下使用衍生类的对象。(Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.)"。LSP 是实现 OCP 原则的重要方式。只有当衍生类能够完全替代它们的基类时,使用基类的函数才能够被安全的重用,然后衍生类也可以被放心的修改了。为了遵守 LSP 原则,并同时符合 OCP 原则,所有的衍生类必须符合使用者所期待的基类的行为。 阅读全文
posted @ 2014-06-18 08:45 sangmado 阅读(17536) 评论(11) 推荐(13) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 21 下一页