算法4-第一章基础

1.1 基础编程模型

1、算法:
我们用算法这个词来描述了解决问题的步骤
2、使用Java编程语言编写程序的原因:
(1)程序是对于算法精确、优雅和完全的描述
(2)可以通过运行程序来学习算法的各种性质
(3)可以在应用程序中直接使用这些算法
3、基础编程模型:
我们把描述和实现算法所用到的语言特性、软件库和操作系统总称为基础编程模型

/**
     * 二分查找
     * @param index
     * @param list
     * @return
     */
    public static int BinarySearch(int index , int[] list){
        int m = 0;
        int n = list.length -1 ;
        while (m < n ) {
            int mid = m+ (n-m)/2;
            if (index < mid) n = mid -1;
            else if (index > mid) m = mid+1;
            else return list[mid];
        }
        return -1;
    }

1.1.1 Java程序的基本结构

1、原始数据类型、语句、数组、静态方法、字符串、标准输入输出、数据抽象

1.1.2 原始数据类型和表达式

1、基本数据类型:int、boolean、double、char
2、运算符:+ - * / …
3、表达式:Java使用的是中缀表达式。(一个字面量、一个运算符、一个字面量)

1.1.3 语句

1、语句:Java程序由语句组成的。语句可以通过创建和操作变量、对变量进行复制并控制这些操作的执行流程来描述运算。
2、声明语句、赋值语句、条件语句、循环语句、调用和返回语句
3、break和continue的区别:
(1)break语句,立即从循环中退出
(2)continue语句,立即开始下一轮的循环

1.1.4 简便记法

1、声明并初始化、隐式赋值、单语句代码块、for语句

1.1.5 数组

1.1.6 静态方法

1、递归(三种情况须符合)
(1)递归中总有方法第一条语句总是一个包含return的条件语句
(2)递归的调用总是去尝试一个规模更小的子问题
(3)递归调用的父问题和尝试解决的子问题之间不应该有交集

/**
     * 二分查找递归实现
     * @param index
     * @param list
     * @param beg
     * @param end
     * @return
     */
    public static int BinarySearchByRecursion(int index, int[] list,int beg, int end) {
        if (beg > end) {
            return -1;
        }
        int mid = beg + (end - beg)/2;
        if (index > list[mid]) {
            return BinarySearchByRecursion(index,list,mid + 1, end);
        } else if (index < list[mid]) {
            return BinarySearchByRecursion(index,list,beg , mid - 1);
        } else {
            return index;
        }
    }

1.1.7 API

1.1.8 字符串

1.1.9 输入输出

1、标准的输入输出

	Scanner in = new Scanner(System.in);
    System.out.println("请输入第一个数 :");
    int m = in.nextInt();
    System.out.println("请输入第二个数 :");
    int n = in.nextInt();

2、重定向和管道
(1)java xxx num rdm > xx.txt:将输出的结果保存在 xx.txt中 ,终端窗口不会输出任何内容,直接写在了文件中
(2)java xxx < xx.txt:从文件中读取数据
(3)管道:将一个程序的输出重定向为另一个程序的输入叫做管道
java xxx num rdm | xx.txt:将标准的输入输出指定为一个流
在这里插入图片描述

1.1.10 二分查找

1.2 数据抽象

1、数据类型指的是一组值和一组对这些值的操作的集合
2、对象:包含了某个数据类型值的实体
3、抽象数据类型:是一种能够对使用者隐藏数据表示的数据类型

1.2.1 使用抽象数据类型

1、就是Java类
2、对象的三大重要特征:
(1)状态:对象的状态即数据类型中的值
(2)标识:对象的标识能够将一个对象区别于另一个对象,对象的标识就是其在内存中的位置
(3)行为:对象的行为指的是数据类型的操作

1.2.2 抽象数据类型举例

1.2.3 抽象数据类型的实现

创建一个对象

1.2.4 更多抽象数据类型的实现

1.2.5 数据类型的设计

1、封装
2、设计API
3、算法与抽象数据类型
4、接口继承
5、toString()
6、内存管理
7、断言:
断言是一条需要在程序的某处确认为true的布尔表达式。如果表达式的值为false,程序将会终止并报告出一条出错的信息。

assert index >= 0;  // 断言

1.3 背包、队列、栈

1、不同点在于删除或者访问对象的顺序不同

1.3.1 泛型

1、泛型:集合类的抽象数据类型的一个关键特性是我们应该可以用他们存储任意类型的数据
2、自动装箱:
自动将一个原始数据类型转换为一个封装数据类型被称为自动装箱。
自动将一个封装的数据类型转换为一个原始数据类型称为自动拆箱。

Stack<Integer> stack = new Stack<Integer> ();
stack.push(17); // 自动装箱(int -> Integer)
int i = stack.pop(); // 自动拆箱(Integer -> int)

3、可迭代的集合类型
4、背包:
背包是一种不支持从中删除元素的集合数据类型-目的就是帮助用例收集元素并迭代遍历所有收集到的元素
5、先进先出队列
6、下压栈(后进、先出)
7、双栈算术表达式求值算法:
(1)将操作数压入操作数栈
(2)将运算符压入运算符栈
(3)忽略左括号
(4)在遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的结果压入操作数栈

1.3.2 集合数据类型的实现

1、定容栈:
(1)一个用于保存栈中的元素的数组a[],和另一个用于保存栈中的元素数量的整数N。
(2)删除一个元素需要将N减1并返回a[N]
(3)添加一个元素,将a[N]设置为新元素并将N加1
2、对象游离:
Java的垃圾收集策略是回收所有无法被访问的对象的内存。在我们对pop()的实现中,被弹出的元素的引用依然存在于数组中-他永远无法被访问了,但Java的垃圾收集器没法知道这一点,除非该引用被覆盖。即使用例已经不再需要这个元素了,数组中的引用依然可以让他继续存在。这种情况称为游离。
避免对象游离很容易,只需要将被弹出的数组元素的值设置为null即可,这将覆盖无用的引用并使系统可以在用例使用完被弹出的元素后回收他的内存

1.3.3 链表

1、链表: 是一种递归的数据结构,它或者为空,或者是指一个节点node的引用,该节点含有一个泛型的元素和一个指向另一条链表的引用

/**
 * 使用嵌套类来定义结点的抽象数据类型
 */
 private class Node {
 	Item item;
 	Node next;
 }

2、构造链表
3、在表头插入结点
4、从表头删除结点
5、从表尾插入结点

1.4 算法分析

1.4.1 科学方法

1、用来研究理解自然世界的方法对于研究计算机程序的运行时间同样有效

1.4.2 观察

1.4.3 数学模型

1、一个程序运行的总时间主要和两点有关系:
(1)执行每条语句的耗时
(2)执行每条语句的频率

1.4.4 增长数量级分类

1、常数级别
2、对数级别
3、线性级别
4、线性对数级别
5、平方级别
6、立方级别
7、指数级别

1.4.5 设计更快的算法

1.4.6 倍率实验

1.4.7 注意事项

1、大常数
2、非决定性的内循环
3、指令时间
4、系统因素
5、不分伯仲
6、对输入的强烈依赖
7、多个问题参量

1.4.8 处理对于输入的依赖

1、输入模型
2、对最坏情况下的性能的保证
3、随机化算法
4、操作序列
5、均摊分析

1.4.9 内存

1、对象
2、链表
3、数组
4、字符串对象
5、字符串的值和子字符串

1.4.10 展望

1、良好的性能是非常重要的,速度极慢的程序和不正确的程序一样无用。

1.5 案例研究:union-find算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本书带完整书签 第1章 基础 1 1.1 基础编程模型 4 1.1.1 Java程序的基本结构 4 1.1.2 原始数据类塑与表达式 6 1.1.3 语句 8 1.1.4 简便记法 9 1.1.5 数组 10 1.1.6 静态方法 12 1.1.7 API 16 1.1.8 字符串 20 1.1.9 输入输出 21 1.1.10 二分査找 28 1.1.11 展望 30 1.2 数据抽象 38 1.2.1 使用抽象数据类型 38 1.2.2 抽象数据类型举例 45 1.2.3 抽象教据类型的实现 52 1.2.4 更多抽象数据类型的实现 55 1.2.5 数据类型的设计 60 1.3 背包、队列和栈 74 1.3.1 API 74 1.3.2 集合类數据类型的实现 81 1.3.3 链表 89 1.3.4 综述 98 1.4 算法分析 108 1.4.1 科学方法 108 1.4.2 观察 108 1.4.3 数学模型 112 1.4.4 增长数量级的分类 117 1.4.5 设计更快的算法 118 1.4.6 倍率实验 121 1.4.7 注意事项 123 1.4.8 处理对于输入的依赖 124 1.4.9 内存 126 1.4.10 展望 129 1.5 案例研究:union-find算法 136 1.5.1 动态连通性 136 1.5.2 实现 140 1.5.3 展望 148 第2章 排序 152 2.1 初级排序算法 153 2.1.1 游戏规则 153 2.1.2 选择排序 155 2.1.3 插入排序 157 2.1.4 排序算法的可视化 159 2.1.5 比较两种排序算法 159 2.1.6 希尔排序 162 2.2 归并排序 170 2.2.1 原地归并的抽象方法 170 2.2.2 自顶向下的归并排序 171 2.2.3 自底向上的归并排序 175 2.2.4 排序算法的复杂度 177 2.3 快速排序 182 2.3.1 基本算法 182 2.3.2 性能特点 185 2.3.3 算法改进 187 2.4 优先队列 195 2.4.1 API 195 2.4.2 初级实现 197 2.4.3 堆的定义 198 2.4.4 堆的算法 199 2.4.5 堆排序 205 2.5 应用 214 2.5.1 将各种數据排序 214 2.5.2 我应该使用啷种排序算法 218 2.5.3 问题的归约 219 2.5.4 排序应用一览 221 第3章查找 227 3.1 符号表 228 3.1.1 API 228 3.1.2 有序符号表 230 3.1.3 用例举例 233 3.1.4 无序链表中的顺序查找 235 3.1.5 有序數组中的二分查找 238 3.1.6 对二分査找的分析 242 3.1.7 预览 244 3.2 二叉查找树 250 3.2.1 基本实现 250 3.2.2 分析 255 3.2.3 有序性相关的方法与删除操作 257 3.3 平衡査找树 269 3.3.1 2-3査找树 269 3.3.2 红黑二叉查找树 275 3.3.3 实现 280 3.3.4 删除操作 282 3.3.5 红黑树的性质 284 3.4 散列表 293 3.4.1 散列函数 293 3.4.2 基于拉链法的散列表 297 3.4.3 基于线性探测法的散列表 300 3.4.4 调整教组大小 304 3.4.5 内存使用 306 3.5 应用 312 3.5.1 我应该使用符号表的哪种实现 312 3.5.2 集合的API 313 3.5.3 字典类用例 315 3.5.4 索引类用例 318 3.5.5 稀疏向量 322 第4章 图 329 4.1 无向图 331 4.1.1 术语表 331 4.1.2 表示无向图的数据类型 333 4.1.3 深度优先搜索 338 4.1.4 寻找路径 342 4.1.5 广度优先搜索 344 4.1.6 连通分量 349 4.1.7 符号图 352 4.1.8 总结 358 4.2 有向图 364 4.2.1 术语 364 4.2.2 有向图的数据类型 365 4.2.3 有向图中的可达性 367 4.2.4 环和有向无环图 369 4.2.5 有向图中的强连通性 378 4.2.6 总结 385 4.3 最小生成树 390 4.3.1 原理- 391 4.3.2 加权无向图的数据类型 393 4.3.3 最小生成树的API和测试用例 396 4.3.4 Prim算法 398 4.3.5 Prim算法的即时实现 401 4.3.6 Kruskal算法 404 4.3.7 展望 407 4.4 最短路径 412 4.4.1 最短路径的性质 413 4.4.2 加权有向图的数据结构 414 4.4.3 最短路径算法的理论基础 420 4.4.4 Dijkstra算法 421 4.4.5 无环加权有向图中的最短路径算法 425 4.4.6 一般加权有向图中的最短路径问题 433 4.4.7 展望 445 第5章 字符串 451 5.1 字符串排序 455 5.1.1 键索引计数法 455 5.1.2 低位优先的字符串排序 458 5.1.3 高位优先的字符串排序 461 5.1.4 三向字符串快速排序 467 5.1.5 字符串排序算法的选择 470 5.2 单词查找树 474 5.2.1 单词查找树 475 5.2.2 单词查找树的性质 483 5.2.3 三向单词查找树 485 5.2.4 三向单词查找树的性质 487 5.2.5 应该使用字符串符号表的哪种实现 489 5.3 子字符串查找 493 5.3.1 历史简介 493 5.3.2 暴力子字符串査找算法 494 5.3.3 Knuth-Morris-Pratt子字符串查找算法 496 5.3.4 Boyer-Moore字符串查找算法 502 5.3.5 Rabin-Karp指纹字符串查找算法 505 5.3.6 总结 509 5.4 正则表达式 514 5.4.1 使用正则表达式描述模式 514 5.4.2 缩略写法 516 5.4.3 正则表达式的实际应用 517 5.4.4 非确定有限状态自动机 518 5.4.5 模拟NFA的运行 520 5.4.6 构造与正则表达式对应的NFA 522 5.5 数据压缩 529 5.5.1 游戏规则 529 5.5.2 读写二进制数据 530 5.5.3 局限 533 5.5.4 热身运动:基因组 534 5.5.5 游程编码 537 5.5.6 霍夫曼压缩 540 第6章背景 558 索引 611
个人觉得是我见过的最简单易懂的算法入门书籍。 以前搜刮过几本算法竞赛书,但是难度终归太大【好吧,其实是自己太懒了】。 略翻过教材,大多数水校的教材,大家懂的。好一点的也是那本国内的经典,不是说它写的不好,只是没有这一本好。 本书Java实现,配有大量的图解,没有一句难懂的话,而且全都是模块化实现。 讲的都是实用算法,没有那些高大上听着名字就让人感到很害怕的东西,个人觉得比CLRS实用性要强,更加适合入门的学习。 大一,推荐这本书入门 【有C语言基础即可,自己去搜索下如何用Java写出Hello World就没有问题】 大二,推荐这本书从头到尾好好读一遍,做下上千道的课后习题 【后面的有点小难度,但是难度不大值得一做,听起来很多的样子,用心去做,相信很快就可以做完的】。 大三,推荐这本书,重新温习已知算法,为找工作,考研做准备。 【可以试着自己在纸上全部实现一遍】 大四,依旧推荐这本书,没事重温经典,当手册来查也不错。 Sedgwick 红黑树的发现者,Donald E.Knuth 的得意门生,对各种算法都有比较深入的研究,他的书,我想不会太差。 也许对于数据结构的学习涉及的内容比较少,没有动态规划,图论也只是讲了很基础的东西,字符串中KMP弄的过于复杂(对比于acm)。但是瑕不掩瑜,对于绝大部分内容真的讲的超级清楚,完美的图解,就像单步调试一样,也许是一本不需要智商就能看懂的算法书(习题应该略有难度,还没有做,打算上Princeton的公开课时同步跟进)。至少这是一本让我这个算法渣渣看了爱不释手,怦然心动的书。 完美学习资源: 官方主页:http://algs4.cs.princeton.edu/home/ Coursera公开课:https://www.coursera.org/course/algs4partI (听说已经开课两期了,最近即将开课的时间是2014/09/05号那期,希望有兴趣的同学一起来学习)。 MOOC平台(笔记、讨论等): http://mooc.guokr.com/course/404/Algorithms--Part-I/ http://mooc.guokr.com/course/403/Algorithms--Part-II/ 不得不吐槽,他的lecture比他的书好,他本人讲的课更是一绝。 互补课程: 斯福坦的Algorithms: Design and Analysis, http://mooc.guokr.com/course/157/Algorithms--Design-and-Analysis--Part-1/ 快毕业了才接触到豆瓣和MOOC,看到很多经典的书籍都是推荐大学一二年级的学生看,每每想到自己却连书皮都没有摸过,就深感惭愧。 我们都老的太快,却聪明得太迟。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值