麻省理工《算法导论》公开课学习笔记【1】

最近在看麻省的《算法导论》公开课(以网易公开课为准),准备就学习体会和相关的编程练习写一篇连载。

简要说一下,语言希望能够都使用python。大多数的算法练习资料都是用C/C++,而且好多公司也要求是C/C++的实现。前段时间一直在用PYTHON,而且也仔细看了些书。

我觉得python还是很不错的语言,语法简要,风格优美。

另外一方面,python的适用性很强,你可以用它开发客户端,也可以写服务端。有时候我常常为自己学习的语言混杂(js、C#、C/C++、php、bash等)而苦恼,我现在希望能够只专注于python的应用。而把精力更多放在一些更深入的内容中,例如机器学习和数据处理等的研究。

---- 引言

第一课主要是讲排序算法和算法性能的一些评估方法和标记。

由于前期没有做很好的准备,笔记不多,现在只给出插入排序和归并排序的算法实现。

1.开发和测试环境说明如下:


程序语言:python 2.7

IDE:ulipad(如果有朋友在安装ulipad出现问题时可以联系我,我之前在win7下用ulipad使用没有,换成xp后竟然安装碰到点问题,索性解决了。)


2.关键笔记

插入排序的时间复杂度是O(n*n),

归并排序的时间复杂度是O(n lg n)。

3. 算法实现

#!/usr/bin/env python
#coding:utf-8

import sys

"""
    This file provide the program of insertion sort
    and merge sort
    @author:xiaoyongpeng
    @date:2012-11-28
"""

def InsertSort(numList):
    len_list = len(numList)
    if not len(numList):
        print  "list must not be null."
        return None
    for j in range(1,len_list):
        temp = numList[j]
        i = j-1
        while i >=0 and numList[i+1] < numList[i]:
            numList[i+1] = numList[i]
            numList[i] = temp
            i -= 1
    return numList


"""
Augrment:
    num : must be float type
"""
def Ceil(num):
    if float(num) - int(num) > 0:
            return int(num)+1
    else:
        return int(num)

    
def MergeSort(numList):
        if len(numList) <= 1:
            return numList
        else:
            half = float(len(numList))/2
            half = Ceil(half)
            
             
            
            numList_first = numList[:half]
            numList_second = numList[half:]
            
            numList_last = []
            
            #print "[%d] %s,%s" % (half,numList_first,numList_second),
           
            numList_first = MergeSort(numList_first)
            numList_second = MergeSort(numList_second)
            
            while numList_first or numList_second:
                if numList_first and numList_second:
                    if numList_first[0] <= numList_second[0]:
                        numList_last.append(numList_first.pop(0))
                    else:
                        numList_last.append(numList_second.pop(0))
                else:
                    numList_last += numList_first if numList_first \
                                    else numList_second
                    break
            #print numList_last 
            return numList_last


if __name__ == '__main__':
    num_list = []
    input_num = raw_input("please input an numList \
and seperated by ',':")
    if input_num:
        temp_list = input_num.strip().split(',')
        try:
            num_list = [int(x) for x in temp_list]
        except ValueError,args:
            print str(args)
            sys.exit(0)
        
    CMD = {'i':InsertSort,'m':MergeSort}
    printInfo = """Please choose your command:
        (i)nsertion sort
        (m)erge sort
        (q)uit
    """
    while True:
        cmd_input = raw_input(printInfo).strip().lower()
        if not cmd_input in 'imq':
            print "Please reinput your command."
            continue
        elif cmd_input == 'q':
            print 'quit now.'
            break
        else:
            #注意列表的赋值操作默认是使用浅拷贝方式
            #例如num_last = num_list指向的引用的对象是一致的
            num_last = [x for x in num_list]
            num_last = CMD[cmd_input](num_last)
            print "First:",num_list
            print "Last:",num_last

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【内容简介】 本书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全 面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。本书专门讨论了线性规划,介绍了动态规 划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算 法,以及对贪心算法元素的讨论。本书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的NP完全性的证明等 内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。. 本书内容丰富,对本科生的数据结构课程和研究生的算法课程都是很实用的教材。本书在读者的职业生涯中,也是一本案头的数学参 考书或工程实践手册。 在有关算法的书中,有一些叙述非常严谨,但不够全面,另一些涉及了大量的题材,但又缺乏严谨性。《算法导论》将严谨性和全面 性融为一体。.. 本书深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。各章自成体系,可以作为独立的学习单元。算法 以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂。说明和解释力求浅显易懂,不失深度和数学严谨性。 本书自第1版出版以来,已经成为世界范围内广泛使用的大学教材和专业人员的标准参考书。第2版增加了论述算法作用、概率分析与 随机算法、线性规划等几章。同时,对第1版的几乎每一节都作了大量的修订。一项巧妙而又重要的修改是提前引入循环不变式,并在 全书中用来证明算法的正确性。在不改变数学和分析重点的前提下,作者将许多数学基础知识从第一部分移到了附录中,并在开始部 分加入了一些富有诱导性的题材。...

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值