普林斯顿算法课--笔记

1-1设计一个算法的步骤:
Steps to developing a usable algorithm.
・Model the problem.
・Find an algorithm to solve it.
・Fast enough? Fits in memory?
・If not, figure out why.
・Find a way to address the problem.
・Iterate until satisfied.
总结:如何使用算法?首先,问题建模,关键是理解问题四什么?有哪些元素?然后找一个可以解决这个问题的算法。若有很多可用的算法,想明白要如何选择(要空间还是时间?),明白到底要满足什么,然后不断找出最佳解决办法。

动态连通性
对连接做如下定义:
1.自反:p连接于自身
2.对称:若p连接于q,则q连接于p
3.传递:若p连接q,q连接r那么p连接r
连通分量:最大可以连通对象的集合,有两个特点:1)连通分量内部任意两个对象都是相连通的;2)连通分量内部的对象不与外部对象相连通。

功能实现:
需要设计一个类,该模型具有如下功能:

  • 现有N个对象,可以任意连接任意两个对象
  • 有一个方法,可以得知任意两个对象是否连接

解决这类问题的第一种方法:Quick Find

Quick Find:
快速查找基于贪心策略,支持这个算法的数据结构是一个简单的对象索引整数数组。
算法效率:对代码进行算法复杂度分析
在这里插入图片描述
假设我们用这个算法最后得到一个完整的连通分量,那至少需要调用N-1次union(),每次Union中至少需要2+N+1次访问数组:两次访问pid和qid,for循环中有N次访问数组比较操作,以及至少一次的赋值操作。所以我们可以得知,对于最终只得到少数连通分量而言,这种方案一般是平方级别的:(N+3)*(N-1)~N^2.我们尽量避免使用平方级别的算法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值