数据结构与算法分析

Lec1 Introduction

概念

Algorithm: a well defined(不同人的理解是一致的) sequence of steps for solving a computational problem

算法

选择排序

选择排序的逻辑是,按照同一方向不断搜索数组中的最小值,并且和上游交换,从而保证上游顺序。

def selection_sort(A[], n):
	for int i = 1 to n-1:
		k = i
		for int j = i+1 to n:
			if A[k] > A[j]:
				k = j
		swap A[k] and A[i]

这里的思想并不是用双指针找出最小值, i i i 是搜索范围的第一项下标,而 k k k 是用来记录最大(最小)值的参数

设计算法的思想

Incremental techniques

将前n-1个位置排好,在处理第n个位置

Recursive techniques

把一个大问题不停地分割,化成很多个简单的小问题

# 题目要求依次打印a到b之间的所有整数
def printSeries(a, b):
	if(a==b) # 这是base case
		print(b)
		return
	else # 这是recursive case
		print(a+',')
		printSeries(a+1, b)

在递归算法中,要搞清楚base case和recursive case,这样就能够比较轻松地写出代码

Lec2 Algorithm Analysis

RAM Computation Model

Memory, CPU, Algorithm

ROM:厂商写死的内存
CPU从RAM(GB水平)中读取数据,将数据(指令)传给ALU,进行运算后输出

算法分析

有以下几个方面:

Correctness analysis

常见的错误有:WA和TLE

Cost analysis

计算机一秒钟能够进行 1 0 8 10^8 108 次基本运算
基本运算:

  1. Initializaiton
  2. Arithmetic
  3. Comparison
  4. Memory access
Space complexity

算法

二分查找

def search():
	int left = 0
    int right = n -1
    while(left < right) // 等于截止,成为目标值
        int mid = (left + right) / 2
        if(a[mid] > k)
            right = mid - 1
        else if(a[mid] = k)
            return mid
        else if(a[mid] < k)
            left = mid + 1

查找<=k的最大index

def search_right()
	int left = 0
    int right = n -1
    while(left < right) // 等于截止,成为目标值
        int mid = (left + right) / 2
        if(a[mid] > k)
            right = mid // mid有可能是答案,不能直接减一
        else if(a[mid] = k)
            right = mid
        else if(a[mid] < k)
            left = mid + 1

查找>=k的最小index

def search_left()
	int left = 0
    int right = n -1
    while(left < right) // 等于截止,成为目标值
        int mid = (left + right + 1) / 2
        if(a[mid] > k)
            right = mid - 1
        else if(a[mid] = k)
            left = mid
        else if(a[mid] < k)
            left = mid

二分答案

适用于:不好解,但是好验证的问题,并且这个问题的答案是单调的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值