Algorithms(week 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.
总结:我们如何使用算法呢?首先,把问题建模,关键是要理解问题是什么?它包含什么元素?然后,找一个可以解决这个问题的算法。如果有很多可用的算法(比如排序算法就有很多),我们要如何选择呢?要空间还是要时间?想明白我们到底要满足什么,然后不断找出最佳解决方法。
动态连接算法:
准备——问题与问题建模:
Given a set of N objects.
・Union command: connect two objects.
・Find/connected query: is there a path connecting the two objects?
问题描述:现在有一堆对象(不重复),可以使用 ”连接命令“,连接相邻的两个对象,那么如何判断任意两个对象之间相连接呢?
问题建模:
1 .我们用0——n个数字代表对象的名称,(比如,int表示数组的索引)。
2.We assume “is connected to” is an equivalence relation:
・Reflexive: p is connected to p.
(任何一个节点与自身都是连接的)
・Symmetric: if p is connected to q, then q is connected to p.
(p可以连接到q,那么q也是可以连接到p的)
・Transitive: if p is connected to q and q is connected to r,then p is connected to r.(p连接q ,q连接r,那么我们说 p可连接r)
3.连接组件:
如下图,这样我们说总共有三个“连接组件”。
也就是说这个算法肯定有两个操作:union操作,queryConnected操作
举个例子,我们事先有如下0——9个数字(对象概念的抽象),执行union命令做连接:
union(4, 3)
union(3, 8)
union(6, 5)
union(9, 4)
union(2, 1)
那么现在 0,7之间是否连接? 否。8,9呢?是。
然后,我们执行连接命令:
union(5, 0)
union(7, 2)
union(1, 0)
union(6, 1)
那么现在0,7是否连接呢?是。
对于海量的数据:
这个算法适用场景? 比如
照片上的像素
- 网络上的节点
- 社交网络中的好友
- 电脑芯片中的晶体管
等等很多
代码实现:
package com.algorithms.week1;//algorithm initialize union find
//quick-find N N 1
public class QuickFindUF {// id数组的索引代表每个对象的名称,值代表连接情况:如果几个对象连接再在一起,则他们的数组值相同private int[] id;/*** 初始化抽象的数据结构,为节点分配初始id.初始时,所有节点都没有关联* * set id of each object to itself (N array accesses)* * @param N*/public QuickFindUF(int N) {id = new int[N];for (int i = 0; i < N; i++)id[i] = i;}/*** check whether p and q are in the same component (2 array accesses)* * @param p* @param q* @return*/public boolean connected(int p, int q) {return id[p] == id[q];}/*** change all entries with id[p] to id[q] (at most 2N + 2 array accesses)* * * In particular if you just have N union commands on N objects which is* Unreasonable.* * n*n* * @param p* @param q*/public void union(int p, int q) {int pid = id[p];int qid = id[q];for (int i = 0; i < id.length; i++)if (id[i] == pid)id[i] = qid;}
}
有个问题,这个 算法会很慢,因为对于union,如果有n个对象,其中每个对象与其他对象连接一次,则会有n*n次运算。这个在海量运算的场景中并不适用!怎么改进呢?待续。。。。
Algorithms(week 1,普林斯顿大学公开课)相关推荐
- 斯坦福大学公开课:iPhone开发教程2010年冬
2019独角兽企业重金招聘Python工程师标准>>> 斯坦福大学公开课:iPhone开发教程2010年冬 http://v.163.com/special/opencourse/i ...
- 【斯坦福大学公开课CS224W——图机器学习】三、节点和图嵌入
[斯坦福大学公开课CS224W--图机器学习]三.节点和图嵌入 文章目录 [斯坦福大学公开课CS224W--图机器学习]三.节点和图嵌入 1. 节点嵌入 1.1 编码器与解码器 1.2 节点嵌入的游走 ...
- 耶鲁大学公开课:博弈论第九节(笔记)
数学公式的格式显示有些问题,可以看原文耶鲁大学公开课:博弈论第九节 Tennis: Venus VS Serena Williams 通过前面的内容我们得知如果要达到混合纳什均衡,那么混合纳什均衡中的 ...
- 中国大学公开课是垃圾,向哈弗公开课叫板!
中国大学公开课是垃圾! 为做出最好的计算机教学视频而努力,向哈弗公开课看齐(以后还有露脸的),哥亲自出马将使国内大学老师无地自容. 我就不信月亮还是国外的大,看看哥做的计算机教学视频. http:// ...
- 斯坦福大学公开课 :机器学习课程
共20讲 在网易公开课上有视频全集,难能可贵的是配带中英文字幕 斯坦福大学公开课 :机器学习课程 在JerryLead的blog中可以下到他的学习笔记以及讲义原稿. 感谢Andrew Ng, 感谢Je ...
- com/HTML/topic/160927. - 百度,耶鲁大学 公开课.doc
耶鲁大学 公开课.doc 耶鲁大学 公开课 /publicforum/content/no05/1/168240.shtml /home/yalecourses / /education/conten ...
- 耶鲁大学公开课博弈论(十八-十九)—— 信息集与最优子博弈
耶鲁大学公开课博弈论(十八-十九)-- 信息集与最优子博弈 理论与概念 在十八讲中介绍了全局纳什均衡点的相关内容,主要就是通过引入信息集的概念将传统的同时博弈也转变为序贯博弈问题,从而使用逆向推理解决 ...
- 【斯坦福大学公开课CS224W——图机器学习】五、消息传递和节点分类
[斯坦福大学公开课CS224W--图机器学习]五.消息传递和节点分类 文章目录 [斯坦福大学公开课CS224W--图机器学习]五.消息传递和节点分类 1. Message Passing and No ...
- 斯坦福大学公开课:iOS 8开发
斯坦福大学公开课:iOS 8开发: http://open.163.com/special/opencourse/ios8.html
最新文章
- 在微信小程序的JS脚本中使用Promise来优化函数处理
- ricker 子波matlab,毕设求助!!!雷克子波合成地震信号
- 浅谈Java泛型中的? extends E和?super E
- H5页面随机数字键盘支付页面
- 华为专家助你1个月拿下物联网高工认证,首次提供全方位就业指导!
- 15 个第三方Web 表单资源
- 百度之星作为座位调整java_百度之星2006年初赛 座位调整
- oracle truncate闪回数据库恢复
- python有什么用-python有什么用
- ‘catkin_make‘ is currently not installed问题修复
- 限制用户不能删除SharePoint列表中的条目(项目)
- ISODATA聚类分析算法原理与C++实现
- Axure原型图入门
- 摘抄笔记 centos内核优化
- C# Wpf Binding 使用详解
- Python报错:local variable referenced before assignment
- Dev c++无法新建项目解决方法
- matlab abc dq,关于matlab及pscad中abc2dq模块的使用.doc
- Spring导入导出,zouzhiy-excel自定义字典转换
- 组织认同对离职倾向的影响研究