复习笔记6_数据结构线性表(强化习题)_话白君的博客-程序员秘密

技术标签: 算法  c++  笔记  数据结构  

习题纠错:

在下面的程序段中,对x的赋值语句的频度为: n(n+1)(n+2)/6 (表示为 n 的函数)

for(int i=1;i<=n;i++)
    for(int j=1;j<=i;j++)
        for(int k=1;k<=j;k++)
   	          x=x+1; 

最暴力的方法就是穷举,但是比较麻烦,在看到答案的时候其实就会有一种猜测:对于这种类型的for循环有 i 重频度就为:n * ( n + 1 ) * ...... * ( n + i - 1 )/ i!
特别的二重就是:n * (n + 1) / 2
三重就是:n * (n + 1) * (n + 2) / 6
四重就是:n * (n + 1) * (n + 2) * (n + 3) / 24
可以用数学归纳法证明一遍,但是为了方便直接通过下面代码的执行来直观的观察。(虽然只到了第五重)

// 时间复杂度.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

void fuzadu1(int n) {
    
    cout << n * (n + 1) * (n + 2) / 6 << endl;
    int x = 0;
    for (int i = 1; i <= n; i++) {
    
        for (int j = 1; j <= i; j++) {
    
            for (int k = 1; k <= j; k++) {
    
                x++;
            }
        }
    }
    cout << x << endl;
}

void fuzadu2(int n) {
    
    cout << n * (n + 1) * (n + 2) * (n + 3) / 24 << endl;
    int x = 0;
    for(int m=1;m<=n;m++)
        for (int i = 1; i <= m; i++) {
    
            for (int j = 1; j <= i; j++) {
    
                for (int k = 1; k <= j; k++) {
    
                    x++;
                }
            }
        }
    cout << x << endl;
}

void fuzadu3(int n) {
    
    cout << n * (n + 1) * (n + 2) * (n + 3) * (n + 4) / (24 * 5) << endl;
    int x = 0;
    for (int z = 0; z <= n; z++) 
        for (int m = 1; m <= z; m++) 
            for (int i = 1; i <= m; i++) {
    
                for (int j = 1; j <= i; j++) {
    
                    for (int k = 1; k <= j; k++) {
    
                        x++;
                    }
                }
            }
    cout << x << endl;
}


int main()
{
    
    fuzadu1(10);
    fuzadu2(10);
    fuzadu3(10);
    return 0}


1、设顺序表用数组A[]表示,表中元素存储在数组0~m+n-1 的范围内,前m个元素递增,后n个元素递增,设计 算法使整个设计表有序。

(1) 给出算法的基本设计思想。
(2) 根据设计思想,采用C或C++语言描述算法,并在关键之处给出注释。
(3) 说明你 所设计的算法的时间复杂度。

(1)给出算法的基本设计思想。

  • 传参:数组A[],m表示前m个数,n表示共有n个数。
  • 定义r表示数组B[]的下标,定义i,j为数组A[]下标。
  • 将数组的A[ i ]同A[ j ]比较,小的存入数组B
  • 若数组A的前m个数未遍历完,将剩余的数依次全部存入B
  • 若数组A的后n个数未遍历完,将剩余的数依次全部存入B

(2)根据设计思想,采用C或C++语言描述算法,并在关键之处给出注释。

void merge(int A[],int m,int n) {
    
	int B[max];
	int r = 0;int i = 0; int j = m;
	while (i < m && j < n) {
        //将数组的A[ i ]同A[ j ]比较,小的存入数组B
		if (A[i] < A[j]) {
    
			B[r++] = A[i++];
		}
		else {
    
			B[r++] = A[j++];
		}
	}
	while (i < m) {
       //若数组A的前m个数未遍历完,将剩余的数依次全部存入B
		B[r++] = A[i++];
	}
	while (j < n) {
       //若数组A的后n个数未遍历完,将剩余的数依次全部存入B
		B[r++] = A[j++];
	}
	for (int i = 0; i < r; i++) {
    
		A[i] = B[i];
	}
}

(3)说明你 所设计的算法的时间复杂度。
时间复杂度:O(n)

源码:

#include<iostream>
using namespace std;
#define eletype int
#define max 50

void init(int A[],int& m,int &n) {
    
	for (int i = 0; i < 10; i++) {
    
		A[i] = i * 2 + 1;
		m++;
	}
	n += m;
	for (int i = 10; i < 20; i++) {
    
		A[i] = (i-10) * 2;
		n++;
	}
}

void printList(int A[],int n) {
    
	for (int i = 0; i < n; i++) {
    
		cout << A[i] << " ";
	}
	cout << endl;
}

void merge(int A[],int m,int n) {
    
	int B[max];
	int r = 0;int i = 0; int j = m;
	while (i < m && j < n) {
    
		if (A[i] < A[j]) {
    
			B[r++] = A[i++];
		}
		else {
    
			B[r++] = A[j++];
		}
	}
	while (i < m) {
    
		B[r++] = A[i++];
	}
	while (j < n) {
    
		B[r++] = A[j++];
	}
	for (int i = 0; i < r; i++) {
    
		A[i] = B[i];
	}
}

int main() {
    
	int A[max];
	int n = 0;
	int m = 0;
	init(A,m,n);
	printList(A,n);
	merge(A,m,n);
	printList(A, n);
	return 0;
}


答案:
(1) 算法的基本设计思想:

将数组A [] 中的m+n个元素(假设元素为int型)看成两个顺序表:表L和表R。将数组当前状态看作是 起始状态,即此时表L由A[]中前m个元素构成,表R由A[]中后n个元素构成。要使A[]中m+n个元素整体有 序,只需将表R中的元素逐个插入表L中的合适位置即可。

插入过程:取表R中的第一个元素A[m+1]存入辅助变量temp中,让temp逐个与A[m],A[m1],...,A[1]进行比较,当temp<A[j](1≤j≤m)时,将A[j]后移一位,否则将temp存入A[j+1]中。重复 上述过程,继续插入A[m+1],A[m+3],...,A[m+n],最终A[]`中元素整体有序。 
void SortArr(int A[],int m,int n) {
    
	for (int i = m; i < m + n; i++) {
    
		int temp = A[i];
		for (int j = i - 1; j >= 0; j--) {
    
			if (temp < A[j]) {
    
				A[j + 1] = A[j];
			}
			else {
    
				A[j + 1] = temp;
				break;     //note:不要忘记!!
			}
		}
	}
}

(3) 算法的时间和空间复杂度
时间复杂度为O(mn)
空间复杂度为O(1)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43700565/article/details/105563557

智能推荐

OpenCV3【神经网络】ANN_MLP_scu30的博客-程序员秘密

//基于OpenCV提供的样例neural_network.cpp,加入了网络保存和读取#include &amp;lt;opencv2/ml/ml.hpp&amp;gt;using namespace std;using namespace cv;using namespace cv::ml;int main(){ //create random training data Mat_&amp;lt...

力扣刷题83——删除排序链表中的重复元素_删除排序链表的重复元素 的时间复杂度_四维sun的博客-程序员秘密

题目:存在一个按升序排列的链表,给你这个链表的头节点head,请你删除所有重复的元素,使每个元素只出现一次。返回同样按升序排列的结果链表。示例:输入:head = [1,1,2]输出:[1,2]解题思路:要删除重复元素,我们需要记录节点的上一节点,所以采用双指针的解法,定义两个指针p和pre都从链表head开始,在后面遍历数组的过程中,使得pre记录p的前一个节点,当遇到p-&gt;val与其前一个节点的值比较,当p-&gt;val==pre...

基于Qlearning强化学习的机器人路线规划仿真_机器人路径规划仿真_我爱C编程的博客-程序员秘密

目录1.算法概述2.仿真效果预览3.核心MATLAB代码预览4.完整MATLAB程序 假设我们的行为准则已经学习好了, 现在我们处于状态s1, 我在写作业, 我有两个行为 a1, a2, 分别是看电视和写作业, 根据我的经验, 在这种 s1 状态下, a2 写作业 带来的潜在奖励要比 a1 看电视高, 这里的潜在奖励我们可以用一个有关于 s 和 a 的 Q 表格代替, 在我的记忆Q表格中, Q(s1, a1)=-2 要小于 Q(s1, a2)=1, 所以我们判断要选择 a2 作为下一个行为. 现

图像边缘提取源码_hobject,'string_fpga和matlab的博客-程序员秘密

function varargout = ActiveCountorsGUI(varargin)% ACTIVECOUNTORSGUI M-file for ActiveCountorsGUI.fig% ACTIVECOUNTORSGUI, by itself, creates a new ACTIVECOUNTORSGUI or raises the existing% singleton*.%% H = ACTIVECOUNTORSGUI returns th...

程序中用sleep和select阻塞休眠的区别_使用sleep延时和slect延时的区别_无名_1989的博客-程序员秘密

在看公司项目中发现超时控制中使用select替代sleep就行阻塞,循环检查任务是否超时,在网上找了很多资料说了select的各种好处:1:sleep不准确,只能精确到秒(这个我感觉可以使用usleep代替,不是个很好理由)。2:sleep容易受到系统信号,例如SIGALRM影响,各个系统版本实现不一,sleep是个glic库函数,不是内核调用。3:更高级的说话是,sleep浪费CPU

WPF---ComboBox数据绑定_LifeOases的博客-程序员秘密

刚刚开始学习WPF,今天用到了ComboBox绑定数据,简单记录一下:1、定义要绑定的数据类型public class ConverterModel{public List&amp;amp;amp;lt;ColorInfo&amp;amp;amp;gt; ColorList {get;set;}public ConverterModel(){ ColorList = new List&amp;amp;amp;lt;ColorInfo&amp;amp;amp;gt;{ new C...

随便推点

MatDEM学习笔记——目录篇_distrirate_搬砖boy的博客-程序员秘密

参数ballRdistriRate:Rmax/Rmin=(1+distriRate)^2粒径分布…tobecontinued

将字符串(“["1","2","3"]”)数组转为 集合(list)_[1, 2, 33]转成数组_qq_32866143的博客-程序员秘密

若有一个user表,现在要批量修改指定的user的性别则,页面传入:修改的user的id:“[“1”,“2”,“3”]”(字符串数组);sex(性别):1user对象:id,name,sex,userIds(将页面的数组id存入到这里),LIst&lt; User &gt; list String userIds = user.getUserIds();//1、获取页面传入的字符串数组 "[...

解决服务器docker中安装依赖卡在node install.js 不动问题_南方北方_k的博客-程序员秘密

install.js,里面的下载是依赖于electron-download这个模块所以在Dockerfile中修改:FROM node:latestRUN mkdir -p /compImg/serviceWORKDIR /compImg/serviceCOPY . /compImg/service# 安装cnpm 即可解决,速度很快RUN npm install -g cnpm --registry=https://registry.npm.taobao.orgRUN cnpm ins

cocoscreator 资源加密_creator加密_专治跌倒扭伤的博客-程序员秘密

当我们做完一个游戏以后,需要对自己图片资源做一定的加密保护,不让别人轻易的破解。cocos官方没有提供资源加密功能,下面提供一种交简单的加解密方案。一、 生成加密脚本加密脚本:encode.py(这个脚本会生成加密后的图片替换原始图片)# -*- coding:UTF-8 -*-#该脚本用于加密png图片 使用python3以上版本解释执行__author__ = "ChenGuanzhou" import osimport timeCUR_DIR = os.getcwd() + "\\b

【微信小程序怎么开店铺】微信小程序店铺怎么制作?_怎么开店铺小程序_小帆Xxx_F的博客-程序员秘密

【微信小程序怎么开店铺】微信小程序店铺怎么制作?线上开店已经是当下非常主流的经营模式之一,尤其是微信小程序,微信小程序在近几年的普及和发展下,大有超越app的使用率。因此,把线上开店铺和微信小程序结合起来,就成为了当下许多企业商家的共同选择。那么微信小程序怎么开店铺,微信小程序店铺怎么制作?

不同浏览器的userAgent_怎么现在浏览器都显示一样的useragent_bin~ibn的博客-程序员秘密

一、基础知识篇:HttpHeader之User-AgentUserAgent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,UserAgent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计;例如用手机访问谷歌和电脑访...

推荐文章

热门文章

相关标签