1月21日 Reference Data Type 数据类型,算法基础说明,二分搜索算法。(课程内容)
Reference Datat Types 引用参考数据类型 -> 组合数据类型
Array, Hash和程序员自定义的复合资料类型
组合数据的修改:
组合数据类型的变量,不是直接存值,而是存一个reference引用位置,指向另一块真正存值的内存空间。
因为组合数据类型是个容器,这个容器可能存有非常多的数据,复制的成本是很高的。因此在默认的情况下,我们不会真的去复制它的值,而是复制引用而已。
object_id 方法 显示内存位置
方法调用也必须注意参数是基本类型还是引用类型:
def foo(x)
x = 9999
return x
end
x = 1 foo(x);
x #=> 基本类型外部的局部变量不会被foo方法所改变
但是Reference Data Type则会被改变。
def bar(x) {
x[0] = 9999;
}
arr = [1,2,3];
bar(arr) #=> [999,2,3]
clone方法
组合数据类别的 = 指派只会复制引用,如果需要真的复制值,需要用clone方法。
⚠️ :Ruby内建的 clone 方法是不支援 deep clone (深度复制,嵌套内的复制)
内建的 clone 是不支援 deep clone,如果真的要复制,你需要自己写方法。
a = [1,2,3]
b = [0, a] c = b.clone
a[0] = 999 b
c
b和c都会变为[0,[999,2,3]]
11 什么是算法?
1960年代发明的Structured programming是一种编程典范,它采用function,程序码区块,循环等结构,来取代传统的goto语法(c语言)。希望借此来改善电脑程序的明晰性,品质以及开发时间,并且避免写出面条式的代码。
现代编程语言的特性: Flow control and function
所谓算法是一种有次序,明确定义和可行,最终会结束,有输出的可执行步骤。
def find_max(arr)
max = arr[0] arr.each do |a|
if a > max
max = a
end
end return max
end
暴力搜寻技术。穷尽可能。
12 评估算法
当数据越来越多,一个算法需要耗费的时间。 Big-O 的符号来描述算法复杂度
def constant(n)
result = n * n
result = result + 1 return result
end
不管n 是多少,执行步骤时间固定,时间复杂度O(1),常数。
def quadratic(n)
sum = 0
1.upto(n) do |i|
1.upto(n) do |j|
sum = sum + i + j
end
end return sum
end
quadratic方法,当n越大,里面的循环就得平方多次,时间复杂度o(n^2)平方的。
def logarithmic(n)
result = 0
while n > 1
n = n.to_f / 2
result += 1
end return result
end
O(logn),对数时间。当n从100变为100000时,时间只是2.5倍而已。
。在数学中,真数 x(对于底数 β)的对数是 βy 的指数 y,使得 x=βy
例子:
,
我们可以得出
,
用日常语言说,以3为底81的对数是4。
快速排序法,(quick sort)—O(n log n)期望时间,O(n2)最坏情况;对于大的、随机数列表一般相信是最快的已知排序。
Ruby中的 Array#sort 就是用快速排序法。
见笔记http://www.cnblogs.com/chentianwei/p/8244728.html,或者维基百科
13 什么是数据结构
数据结构定义资料之间的相互关系,是设计算法的载体,数据输入输出和设计算法步骤时,都会对应于使用的数据结构。而不同的数据结构有不同的特性。在计算机本科生的课程中,有门数据结构的课,就是在分析各种不同的数据结构,做不同操作时的优点点和复杂度:Common Data Structure Operations
对 Ruby 程序员来说,最常用的就是 Array 和 Hash,现在我们来分析一下常用的操作,对 Array 和 Hash 的算法复杂度。
插入和删除到容器里面
要在数组中插入一个值,如果刚好在最后(例如 Arrar#push 方法),是 O(1)
如果在数组中间插入一个值,因为数组是内存中「连续」的空间,中间新插入,会需要搬动后面所有元素的位置往后移动一格,这是 O(n) 的算法,n 越大需要移动的元素越多。
对散列 Hash 来说,插入是平均复杂度是 O(1)。
检查一个值都没有在容器里面
Array 是 O(n),需要走访整个数组依序检查
Hash 是 O(1),只要将 key 经过散列算法,就可以直接检查那个位置有没有数据。
Ruby 内建有 benchmark 工具,可以让我们量测一个方法的执行时间
还有一道二分算法搜索题。没做。
这门教程的知识点非常多,包括了计算机大学本科 1. 数据结构 2. 算法 3. 操作系统 4. 编译器 5. 编程语言,大一到大三共五门必修课程的主要概念。我推荐以下的书籍可以继续进修:
- 改变未来的九大算法 介绍九个影响世界的重要的算法,没有代码,是科普书
- 一路编程,入门程度的概括性介绍软件编程
- 代码之髓 介绍编程语言的设计
- 程序是怎样跑起来的
- 计算机是怎样跑起来的
- 大话数据结构
- 算法图解
二分搜索:
Ruby 的 Array#find_index 方法可以从数组中寻找一个值,回传它的索引,这个算法是 O(n)。
arr = [5,1,9,6] arr.find_index(9) # 回传 2
Ruby 还有一个 Array#bsearch,实作了 二分搜索算法 binary search。如果你已知数组是排序过的,这个算法会是 O(log n)。
https://gist.github.com/michaelmakun/5a3ac6c03fd386e0629d5f1ed8a10ed1
1月21日 Reference Data Type 数据类型,算法基础说明,二分搜索算法。(课程内容)的更多相关文章
- 西安7月21日「拥抱开源,又见.NET:壹周年Party」线下交流活动
本次活动既是.NET西安社区的第四次线下交流活动,也是.NET西安社区成立一周年庆活动..NET西安社区2018年7月20日成立,经过一年时间的发展,社区共举办过3次大型线下交流活动,社区人数由最初的 ...
- 2016年12月21日 星期三 --出埃及记 Exodus 21:16
2016年12月21日 星期三 --出埃及记 Exodus 21:16 "Anyone who kidnaps another and either sells him or still h ...
- 2016年11月21日 星期一 --出埃及记 Exodus 20:12
2016年11月21日 星期一 --出埃及记 Exodus 20:12 "Honor your father and your mother, so that you may live lo ...
- 2016年10月21日 星期五 --出埃及记 Exodus 19:5
2016年10月21日 星期五 --出埃及记 Exodus 19:5 Now if you obey me fully and keep my covenant, then out of all na ...
- 成都Uber优步司机奖励政策(2月21日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 长沙4月21日开发者大会暨.NET社区成立大会活动纪实
活动总结 2019年4月21日是一个斜风细雨.微风和煦的美好日子,由长沙.NET技术社区.腾讯云云加社区.微软Azure云技术社区.中国.NET技术社区.长沙柳枝行动.长沙互联网活动基地(唐胡子俱乐部 ...
- 【12月21日】A股滚动市盈率PE历史新低排名
2010年01月01日 到 2018年12月21日 之间,滚动市盈率历史新低排名.上市三年以上的公司,2018年12月21日市盈率在300以下的公司. 1 - 厦门象屿(SH600057) - 历史新 ...
- 成都Uber优步司机奖励政策(4月21日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 北京Uber优步司机奖励政策(4月21日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
随机推荐
- 主成分分析(PCA)学习笔记
这两天学习了吴恩达老师机器学习中的主成分分析法(Principal Component Analysis, PCA),PCA是一种常用的降维方法.这里对PCA算法做一个小笔记,并利用python完成对 ...
- 神州行省内流量套餐6元500M申请,发送BLSN6到10086即可
神州行流量套餐,神州行省内流量套餐6元500M申请,发送BLSN6到10086即可申请开通专属流量包,比全国5元30M划算多了4G全国流量套餐 5元/30M 10元/100M 20元/300M 30元 ...
- linux 判断文件最后更新时间 实现监控日志是否有输出功能
linux 判断文件最后更新时间 实现监控日志是否有输出功能. 需求:监控log.txt日志文件,超过一分钟没输出内容就认为是停了,则自动启动程序. 用stat 可以看文件的更新时间stat -c % ...
- oracle用户名和密码到期后如何处理
原因:确定是由于Oracle11g中默认在default概要文件中设置了“PASSWORD_LIFE_TIME=180天”所导致. 影响: 1.密码过期后,业务进程连接数据库异常,影响业务使用. 2. ...
- c++的友元类、方法及其益处
在java中,我们知道除了public和private,protected外,还有默认的包可见性访问级别,虽然如此,很多时候出于早期设计缺陷的原因,我们需要访问一些包或者protected可见性级别的 ...
- MVC 扩展RadioButtonListFor和CheckBoxListFor
学习MVC时候前端通常会用到HtmlHelper,使得前端编码简便很多.我们可能会经常用到htmlHelper中一些的EditorFor,LabelFor,ValiationMessageFor, 发 ...
- HTML5 表单元素和属性
HTML5 表单元素和属性学习 版权声明:未经博主授权,内容严禁转载 ! 表单元素简介 无论实现提交功能还是展示页面功能,表单在HTML中的作用都十分重要. 在其他版本的HTML中,表单能够包含的元素 ...
- React 回忆录(四)React 中的状态管理
Hi 各位,欢迎来到 React 回忆录!
- Python之GUI的最终选择(Tkinter)
首先,Tkinter是Python默认的GUI库,想IDLE就是用Tkinter设计出来的,因此直接导入Tkinter模块就可以啦 1 import tkinter (1)Tkinter初体验: 1 ...
- 浅入浅出JS中的eval及json
声明: 首先声明一下,本人是JS新手,所以不敢说深入,只是把最近对eval的学习经验拿出来跟大家分享,如果您是高手可略去不看. 适合读者: 对JS中的eval一知半解,不知eval是如何把字符串转换为 ...