`
hideto
  • 浏览: 2682410 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CLRS笔记2:算法入门

阅读更多
1,增量法(incremental)
例:插入排序(insertion sort)
ruby版本:
def insertion_sort(a)
  a.each_with_index do |el,i|
    j = i - 1
    while j >= 0
      break if a[j] <= el
      a[j + 1] = a[j]
      j -= 1
    end
    a[j + 1] = el
  end
end

erlang版本:
-module(insertion_sort).
-export([sort/1]).

sort(List) ->
  sort(List, []).

sort([H | T], Acc) ->
  sort(T, insert(H, Acc));

sort([], Acc) ->
  Acc.

insert(E, Acc = [H | _T]) when E < H ->
  [E | Acc];

insert(E, [H | T]) when E >= H ->
  [H | insert(E, T)];

insert(E, []) ->
  [E].

循环了1+2+3+...+(n-1) = n(n+1)/2次,时间为Θ(n^2)

2,分治法(divide-and-conquer)
例:合并排序(merge sort)
ruby版本:
def merge(l, r)
  result = []
  while l.size > 0 and r.size > 0 do
    if l.first < r.first
      result << l.shift
    else
      result << r.shift
    end
  end
  if l.size > 0
    result += l
  end
  if r.size > 0
    result += r
  end
  result
end

def merge_sort(a)
  return a if a.size <= 1
  middle = a.size / 2
  left = merge_sort(a[0, middle])
  right = merge_sort(a[middle, a.size - middle])
  merge(left, right)
end

erlang版本:
-module(merge_sort).
-export([sort/1]).

sort([]) -> [];
sort([L]) -> [L];
sort(List) ->
    {Left, Right} = lists:split(length(List) div 2, List),
    merge(sort(Left),sort(Right)).
merge(L, []) -> L;
merge([], R) -> R;
merge([L|Left], [R|_]=Right) when L < R ->
    [L | merge(Left, Right)];
merge(Left, [R|Right]) ->
    [R | merge(Left, Right)].

运行了n/2+n/4+n/8+... = n次,时间为Θ(n)


回家又看了一下merge sort的时间复杂度的计算方法,发现自己想错了:
merge时间并不是n/2 n/4 n/8的数列
一个数组一直切分切分,最后如果切分到size = 1时,可以认为merge时间为n/2,但向上归并时size > 1时,这时的merge时间不是简单的上级的1/2

正确的公式T(n) = 2T(n/2) + cn,其中cn表示合并两个子数组的时间,为n的线性函数,分解时间为Θ(1),可以忽略
算法导论对merge sort的时间复杂度的推算方法是扩展递归树:
T(n)
||
cn + T(n/2) + T(n/2)
||
cn + (cn/2 + cn/2) + T(n/4) + T(n/4) + T(n/4) + T(n/4)
||
...
cn + (cn/2 + cn/2) + (cn/4 + cn/4 + cn/4 + cn/4) + .... + (c + c + c + ...)
||
cn + (cn/2 + cn/2) + (cn/4 + cn/4 + cn/4 + cn/4) + .... + (cn*(1/2)^x + cn*(1/2)^x + cn*(1/2)^x + ...)

cn*(1/2)^x = c
x = lgn

即一共有lgn + 1层,而每层加起来的和又是cn,所以T(n) = cn*(lgn + 1) = Θ(nlgn)
分享到:
评论
1 楼 blackanger 2008-10-23  
来学习学习,这个系列不错

相关推荐

    CLRS-go:算法导论

    《CLRS-go:算法导论》是基于经典教材《算法导论》的Go语言实现,由托马斯·科门、查尔斯·莱森、罗纳德·里维斯特和克利福德·斯坦等著名计算机科学家合著。这本书是算法学习的宝典,覆盖了从基础到高级的各类算法,...

    CLRS:算法入门第3版中的一些练习和问题

    笔记本摘要我基础1算法在计算中的作用2入门3功能成长4分而治之5概率分析和随机算法II排序和订单统计6堆排序7快速排序8线性时间排序9中位数和订单统计III数据结构10种基本数据结构11哈希表12个二叉搜索树13棵红黑树14...

    算法书 Solutions for CLRS Computer Algorithms CLRS for Instructor 《算法导论——教师用书

    CLRS for Instructor 《算法导论——教师用书》(有部分习题答案) Computer Algorithms - Introduction to Design and Analysis 3rd - Sara Baase Solutions for CLRS (算法导论部分习题解答)

    CLRS(Introduction.to.Algorithms.Second.Edition)

    《CLRS:算法导论(第二版)》是计算机科学领域经典的教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest 和 Clifford Stein四位作者共同编写。这本书深入浅出地介绍了算法的设计、分析以及计算复杂...

    CLRS:算法导论学习集

    2. **图算法**:包括Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法、Kruskal最小生成树算法等,这些算法广泛应用于网络规划和路径寻找。 3. **动态规划**:如背包问题、最长公共子序列、最短路径...

    clrs_introductionAlgo:基于clrs教科书的算法基础知识练习

    CLRS教材练习算法关于该项目重点在于通过在代码中实现对基本和高级数据结构及算法的掌握。 这主要是在Python中完成的。促成主题分叉项目创建功能分支( git checkout -b feature/AmazingFeature ) 提交更改( git ...

    【算法导论第三版中的算法及习题】CLRS-master

    2. **准备技术面试的求职者**:算法和数据结构是技术面试中的重点,通过练习 CLRS 中的习题,求职者可以系统地复习和掌握常见的算法问题,为面试做好充分准备。 3. **算法爱好者和开发者**:对于已经工作但希望提升...

    clrs-notes-solutions, 算法导论,第3版,学习笔记,习题答案.zip

    通过"clrs-notes-solutions"的学习笔记,读者可以对这些算法有更深入的理解,掌握它们的实际应用和潜在的优化技巧。同时,开源性质使得这些资源成为宝贵的自学资料,可以与其他学习者交流,共同提高。

    CLRS算法导论答案

    大名鼎鼎的 CLRS Algorithm Introduction 算法导论 课后大部分的题目解答

    clrs:CLRS算法的实现

    《CLRS算法的实现》是基于Python编程语言对经典算法教科书《Introduction to Algorithms》(简称CLRS)中的算法进行的实际编码。这本书是计算机科学领域最权威的算法教材之一,由Thomas H. Cormen、Charles E. ...

    CLRS:算法简介解决方案

    Cormen(CLRS)提出的算法介绍解决方案。贡献者如果我在这里想念您的名字,请向我提出要求进行修复。 您可能对生成贡献的CLRS的另一个repo 感兴趣。此仓库需要您的帮助。 如果您对此项目感兴趣,可以完成下面列表中...

    Cormen-Algorithms-Data-Structures:“算法入门,第三版-CLRS”一书中的算法实现以及数据结构

    《算法入门,第三版-CLRS》一书中的重要算法以及基本数据结构的实现。 总览 我打算对所有这些算法/数据结构进行编码,并使用不同的语言编写,但仍有许多实现方法。 算法/数据结构及其实现的详细信息将在算法文件夹...

    算法导论教师手册 CLRS

    《算法导论教师手册》(CLRS)是与广受赞誉的教材《算法导论》第二版相配套的教学辅助资料,由Thomas H. Cormen、Clara Lee和Erica Lin共同编写,旨在为教授和学习算法的学生提供深入的指导和支持。这本手册包含了对...

    clrs_prev.rar_CLRS_算法导论 答案_算法导论答案

    "clrs_prev.rar_CLRS_算法导论 答案_算法导论答案"这个压缩包文件显然包含了该书的习题解答,由南大学长提供,并且保证了答案的正确性。 《算法导论》涵盖了排序、搜索、图算法、动态规划、贪心算法、分治策略等...

    CLRS算法的实现_Python_C_下载.zip

    2. **提升编程技巧**:学习如何在不同语言环境下实现同一算法,理解两种语言的异同。 3. **提高分析能力**:分析代码的时间复杂度和空间复杂度,理解算法的效率。 4. **实践应用**:将这些算法应用于实际项目,提升...

    leetcodeidea-LeetCode-CLRS-Python:最后,要拿LeetCode

    CLRS 最后,要拿 LeetCode,Python 可以让你专注于想法,而 CLRS 真的有点乏味,所以每当你读完时,你就会感到很高兴,因为你可以做 LeetCode。 :books: :open_book: :pencil: :notebook: :hamburger: :spaghetti: :...

    算法导论的笔记

    - 教材:《算法导论》(CLRS) - 课程网站 - 额外辅导资源 - 注册指南(仅MIT学生) - 问题集 - 算法描述方法 - 成绩评定政策 - 合作政策 #### 二、算法分析的重要性 - **定义**:算法分析是理论研究计算机...

    算法导论 CLRS 英文第三版

    - **第2章:入门** - **2.1 插入排序**:介绍了一种简单而直观的排序方法——插入排序。 - **2.2 分析算法**:讲解了如何分析算法的时间复杂度和空间复杂度。 - **2.3 设计算法**:提供了一些设计高效算法的基本...

Global site tag (gtag.js) - Google Analytics