蛮力算法作业

Note:该文章只是个人想法,如果发现有什么问题,请留言!!!

3.1.7 一摞假币问题

a.

一摞一摞的称,重量最大的那一摞就是假币

最坏情况:O(n)

b.

至少需要称2次

3.1.14 交替放置的碟子

算法

//输入:T[0..2n-1]个黑白交替的盘子
//输出:T[0..2n-1]前n个事白盘子,后n个是黑盘子
for i <- 0 to n-1 do
	j <- i
	while(j < 2n-2-i) do
		swap(T[j], T[j+1])
		j <- j+2

换位次数:
n u m = ∑ i = n 1 i = n ( n + 1 ) 2 num=\sum_{i=n}^1i=\frac{n(n+1)}{2} num=i=n1i=2n(n+1)

3.2.6

比较次数:
( m − 1 ) ∗ ( n − m + 1 ) 次 (m-1)*(n-m+1)次 (m1)(nm+1)

3.2.8

a.

算法

//输入:S[0..n-1]字符串
//输出:以A开始B结尾的字符串的个数
BruteForceFindSubString(S[0..n-1])
	count <- 0
	for i <- to n-1 do
		if S[i]=='A' do
			for j <- i+1 to n-1 do
				if S[j] == 'B'
					count++
	return count

效率类型:
O ( n 2 ) O(n^2) O(n2)

b.

算法

//输入:S[0..n-1]
//输出:以A开始B结尾的字符串的个数
BruteForceFindSubString(S[0..n-1])
	count <- 0 //记录总个数
	t <- 0 //中间变量,记录访问过的A的个数
	for i <- 0 to n-1 do
		if S[i]=='A' do
			t++
		if t>0 && S[i]=='B' do
			count <- count+t
	return count

效率类型:
O ( n ) O(n) O(n)

3.3.6 奇数派游戏

3.4.6 划分问题

算法:

//输入:n个正整数T[0...n-1]
//输出:两个不相交的集合并且两个集合的值相等
//下面这个算法是找到两个子集中的一个子集,剩下的就是用初始
//的减去找到的子集得到另一个子集
total <- sum(T[0..n-1])
if total % 2 == 1
	return -1
else do
	T[0..n-1] <- sort(T[0..n-1])
	m <- 0
	n <- total/2
	if T[n-1] > n
		return -1
	else
		j <- 0
        m <- T[n-1]
        M[j] <- m
        j++
        for i <- n-2 to 0 do
        	if m+T[i]>n
        		continue
        	else if m+T[i]==n
        		M[j] <- T[i]
        		return M
        	else
        		M[j] <- T[i]
        		j++
        		m <- m+T[i]
        return -1

3.4.7 完备子图问题

算法

依次从图G的顶点出发,找到度数大于等于(k-1)的顶点个数,如果满足这样的顶点个数大于等于K个,就说明图G包含一个大小为k的完备子图。
伪代码:
CliqueQuestions(G(v), k)
	//输入,图G(v),v为顶点的个数, 正整数k
	//输出,是否能找到一个具有k个节点的完备子图
	count <- 0 //对满足要求的顶点数计数
	for i <- 0 to v do
		if v[i] >= k-1 do	//v[i]表示顶点的度数
			count++
        else do
        	continue
    if count >= k do
    	return true
    else do
    	return false
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页