数据结构学习笔记(1)

一.图灵机

1.图灵机的构成

        一条无限长的分格纸带,每格可以记录1个符号一个读写头,可在纸带上左右移动,能读出和擦写格子的字符

一个状态寄存器,记录有限状态中的1个状态一系列有限的控制规则:

        ·某个状态,读入某个字符时:

        ·要改写成什么字符

        ·要如何移动读写头

        ·要改变为什么状态

看一个图灵机例子

判定{ambm|m>=0}:左半部全是a,右半部全是b,且ab数量相等的字符串,

        如:ab、aabb、aaaabbbb,进入“

接受”状态

        如:b、ba、abb,进入“拒绝”状态

2.规则思路实例

读写头来回移,将a和b一一对消,如果最后剩下空白B则接受,否则拒绝。

        初始状态s0是读写头停在第一个字符处

        s1状态是读写头正在右移。

        s2状态是读写头到字符串最右边

        s3状态是读写头正在向回左移

判定ambm模式串图灵机的规则:

        <s0, a, B, s1, R>:初始碰到a消去,s1,右移

        <s1, a, a, s1, R>:消去1个a的状态,继续右移,找最后一个b

        <s1, b, b, s1, R>:遇到b,继续右移

        <s1,B, B, s2, L>:右移到尾,状态s2,回移

        <s2,b,B,s3,L>:如果有b,消去,进入左移状态s3

        <s3, b, b, s3, L>:左移遇到b,继续左移

        <s3, a, a, s3, L>:左移遇到a,继续左移

        <s3, B, B, s0, R>:左移到头回初始状态s0,右移检查下个字符

        <s0, B, B, sY, N>:a,b都能一一消完,则进入“接受”状态,停机

        <s0, b, b, sN, R>: b多了,或者b在a前,进入 “拒绝”状态,停机

        <s2, a, a, sN, R>:s2是末尾状态,如果碰到a,表示a多了,或者a在b后,进入“拒绝”状态,停机

        <s2,B,B, sN, R>:s2是末尾状态,如果没碰到b,表示a多了,进入“拒绝”状态,停机

二.计算复杂性

        计算复杂性理论是理论计算机科学的分支学科,使用数学方法对计算中所需的各种资源的耗费作定量的分析,并研究各类问题之间在计算复杂程度上的相互关系和基本性质。

1.使用运行时间检测复杂度

1.累加法

#使用time检测累加法的运行时间
import time

def sumOfN2(n):
    start = time.time()
    theSum = 0
    for i in range(0,n+1):
        theSum = theSum + i
    end = time.time()
    return theSum, end - start

for i in range(5):
    print('the sum is %d required %10.7f seconds' % sumOfN2(1000000))
the sum is 500000500000 required  0.0369010 seconds
the sum is 500000500000 required  0.0364530 seconds
the sum is 500000500000 required  0.0369017 seconds
the sum is 500000500000 required  0.0419617 seconds
the sum is 500000500000 required  0.0388973 seconds

2.累加公式法

#使用time检测无迭代法的运行时间
import time

def sumOfN2(n):
    start = time.time()
    theSun = 0.5 * n * (n + 1)
    end = time.time()
    return theSum, end - start

for i in range(5):
    print('the sum is %d required %10.7f seconds' % sumOfN2(1000000))
the sum is 500000500000 required  0.0000000 seconds
the sum is 500000500000 required  0.0000000 seconds
the sum is 500000500000 required  0.0000000 seconds
the sum is 500000500000 required  0.0000000 seconds
the sum is 500000500000 required  0.0000000 seconds

#运行时间大大减少
#O(1)算法

2.大O表示法

赋值语句包含了表达式计算和变量存储这两个基本资源。这是一个合理的度量单位。

问题规模是影响运算的主要因素。

1.分析sumOf(n)的执行次数

#使用time检测累加法的运行时间
import time

def sumOfN2(n):
    start = time.time()
    theSum = 0                 #赋值语句,执行1次;
    for i in range(0,n+1):     #for循环,把循环体重复n次;
        theSum = theSum + i    #循环内部一个赋值语句,执行1次
    end = time.time()
    return theSum, end - start

# T(n) = n + 1

2.使用大O表示法度量复杂度

        数量级函数描述了T(n)中随着n增大增长最快的主导部分,称为大O表示法。记作O(f(n)),其中,f(n)表示T(n)中的主导部分。

例1.T(n) = n + 1

记作:O(n)

例2.T(n) = 5n**2 + 27n + 4110

记作:O(n**2)  #系数5不记作f(n)中

3.常见的大O数量级函数

通常当n较小时,难以确定其数量级当n增长到较大时,容易看出其主要变化量级。

✿for循环

        range是一个函数,它返回的是一个可迭代对象,大多使用于for循环中。相当于C/Java 里面的 for (int i = m; i < n; i++)循环。

range(stop)
range(start, stop[, step])

start作为开始值,开始值作为开始的那个数,不输入的话默认从0开始
stop作为结束值,结束值所代表的不是结束的那个值,而是结束的那个下标,结束值的下标是从0开始算起。例如你输入5,那么输出之后就是4。(注意:结束值不可省略)
step作为步进值,不进值代表一次你想要步进多少个,假如输入1的话,那输出之后就可以看到每一个数据之间相隔了1的差距,如果步进值省略的话,它的默认值依旧是1,只有当你自己输入其他的步进值,它才会改变。

#coding=utf-8

import time

#代表1到4,不包含4
for i in  range(1, 4):
    print(i)
#设置停顿三秒
time.sleep(3)
#输出:1  2  3
#代表1到10,间隔2,不包含10
for i in range(1, 10, 2):
    print(i)
time.sleep(3)
#代表0到5,不包含5
#输出:1  3  5  7  9
for i in range(5):
    print(i)
time.sleep(3)
# 0  1  2  3  4

例1.计算O(n)

T(n) = 3+3n**2+2n+1 = 3n**2+2n+4

a = 5
b = 6
c = 10     #为3

for i in range (n)      #为3n**2
    for j in range (n)
        x = i * i
        y = i * j
        z = j * j    

for k in range (n)      #为2n
    w = a * k + 50
    v = a * b

d = 33    #

数量级为:O(n**2)

4.大O表示法

        大O表示法表示所有上限中最小的那个上限。 而大𝛀表示法表示所有下限中最大的那个下限。

5.大𝚹表示法

         如果上下限相同,那么就可以用大𝚹表示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值