学习打卡1##有关算法

近两周初学算法,打算把算法导论上部分伪代码用C++或python实现一遍
1.归并排序算法的在C++上的实现:
算法的基本思路如下:
通过递归调用把数组分成更小的数组,对小的数组进行排序从而达成排序的效果。
在这里插入图片描述

void Merge(int point[], int low, int mid, int high)
{
	int k = 0;
	int i = low;
	int j = mid + 1;
	int* temp = new(nothrow) int[high - low + 1];
	if (!temp) { //内存分配失败
		cout << "error";
		return;
	}

	while (i <= mid && j <= high)
	{
		if (point[i] < point[j])
			temp[k++] = point[i++];
		else
			temp[k++] = point[j++];
	}
	while (i <= mid)
	{
		temp[k++] = point[i++];
	}
	while (j <= high)
	{
		temp[k++] = point[j++];
	}
	for (int k = 0, i = low; i<=high; ++k, ++i)
	{
		point[i] = temp[k];
	}
	delete[]temp;
}

void MergeSort(int arr[], int low, int high)
{
	if (low < high)
	{
		int mid = (low + high) / 2;
		MergeSort(arr, low, mid);
		MergeSort(arr, mid + 1, high);
		Merge(arr, low, mid, high);
	}
}

int main() {
    int a[10] = { 5,1,9,3,7,4,8,6,2,0 };
    MergeSort(a, 0, 9);
    for (int i = 0; i < 10; i++)
        cout << a[i] << " ";
    return 0;
}

2.关于n*n矩阵乘法的实现
a.最简单的实现方法:

def Mutiply1(A,B):
    n=len(A)
    m=0
    C=[[m]*n  for x in range(n)]##用来保存相乘的结果
    for i in range(n):
        for j in range(n):
            C[i][j]=0
            for  k in range(n):
                C[i][j]=C[i][j]+A[i][k]*B[k][j]
    return C
a=[[1,1,1],[1,1,1],[1,1,1]]
b=[[1,1,1],[1,1,1],[1,1,1]]
Mutiply1(a,b)

运行结果如下:

[[3, 3, 3], [3, 3, 3], [3, 3, 3]]

b. 利用简单的分治法实现:
此方法通过将矩阵分块成4个小矩阵,利用递归的方法实现矩阵的乘法。
基本思路如下图:
在这里插入图片描述
本算法的效率并没有比上一个暴力算法高。该算法真正难点是如何把矩阵分块成子矩阵并最后合并,暂时我还没有思路如何去做这一点。以下是我尝试过但报错的代码:

def Mp11(matrix):##矩阵分块
    row=len(matrix)##行数
    end=int(row/2)##原矩阵行列数一半取整
    new=[[0]*end for i in range(end)]
    for m in range(end):##
        new[m]=matrix[m][:end]
    return new
def Mp12(matrix):
    row=len(matrix)
    end=int(row/2)
    new=[[0]*end for i in range(end)]
    for m in range(end):
        new[m]=matrix[m][end:]
    return new
def Mp21(matrix):
    row=len(matrix)
    if row%2!=0:
        end=int(row/2)+1
        new=[[0]*end for i in range(end)]
        for m in range(end):
            new[m]=matrix[end+m-1][:end-1]
        return new
    else: 
        row=len(matrix)
        end=int(row/2)
        new=[[0]*end for i in range(end)]
        for m in range(end):
            new[m]=matrix[end+m][:end]
        return new
def Mp22(matrix):
    row=len(matrix)
    if row%2!=0:
        end=int(row/2)+1
        new=[[0]*end for i in range(end)]
        for m in range(end):
            new[m]=matrix[end+m-1][end-1:]
        return new
    else:
        row=len(matrix)
        end=int(row/2)
        new=[[0]*end for i in range(end)]
        for m in range(end):
            new[m]=matrix[end+m][end:]
        return new
def add(a,b):
    n=len(a)
    c=[[0 for col in range(n)]  for row in range(n)]
    for i in range(n):
        for j in range(n):
            c[i][j]=a[i][j]+b[i][j]
    return c
def combination(a11,a12,a21,a22):
    a=len(a11)
    b=len(a21)
    n=int((a+b)/2)
    c=[[0 for col in range(a+b)]  for row in range(a+b)]
    for i in range(a+b):
        for j in range(a+b):
            if i<=n and j<=n:
                c[i][j]=a11[i][j]
            elif i<=n and j>n:
                c[i][j]=a12[i][j-n]
            elif i>n and j<=n:
                c[i][j]=a21[i-n][j]
            elif i>n-1 and j>n-1:
                c[i][j]=a22[i-n][j-n]
    return c

下面是主函数:

def Mutiply2(A,B):
    n=len(A)
    C=[[0]*n for x in range(n)]
    if n==1:
        C[0][0]=A[0][0]*B[0][0]
    else:
        C11=add(Mutiply2(Mp11(A),Mp11(B)),Mutiply2(Mp12(A),Mp21(B)))
        C12=add(Mutiply2(Mp11(A),Mp12(B)),Mutiply2(Mp12(A),Mp22(B)))
        C21=add(Mutiply2(Mp21(A),Mp11(B)),Mutiply2(Mp22(A),Mp21(B)))
        C22=add(Mutiply2(Mp21(A),Mp12(B)),Mutiply2(Mp22(A),Mp22(B)))
        C=combination(C11,C12,C21,C22)
    return C
a=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]
b=a
Mutiply2(a,b)

会报错

IndexError                                Traceback (most recent call last)
<ipython-input-48-0faec53a1dd5> in <module>()
      4 a=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]
      5 b=a
----> 6 Mutiply2(a,b)

<ipython-input-47-a6959dd72c2c> in Mutiply2(A, B)
      5         C[0][0]=A[0][0]*B[0][0]
      6     else:
----> 7         C11=add(Mutiply2(Mp11(A),Mp11(B)),Mutiply2(Mp12(A),Mp21(B)))
      8         C12=add(Mutiply2(Mp11(A),Mp12(B)),Mutiply2(Mp12(A),Mp22(B)))
      9         C21=add(Mutiply2(Mp21(A),Mp11(B)),Mutiply2(Mp22(A),Mp21(B)))

<ipython-input-47-a6959dd72c2c> in Mutiply2(A, B)
      9         C21=add(Mutiply2(Mp21(A),Mp11(B)),Mutiply2(Mp22(A),Mp21(B)))
     10         C22=add(Mutiply2(Mp21(A),Mp12(B)),Mutiply2(Mp22(A),Mp22(B)))
---> 11         C=combination(C11,C12,C21,C22)
     12     return C

<ipython-input-46-b513a2aa6d37> in combination(a11, a12, a21, a22)
     58         for j in range(a+b):
     59             if i<=n and j<=n:
---> 60                 c[i][j]=a11[i][j]
     61 
     62     return c

IndexError: list index out of range

以上代码十分冗长,以后有思路再来看看如何实现这个算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值