数据结构第一章概论MOOC整理

1.以下哪种结构是逻辑结构,而与存储和运算无关:A
A.队列
B.双链表
C.数组
D.顺序表

解析: A、队列:可以是顺序或链式存储,是逻辑结构 B、双链表:链式存储 C、数组:按索引值从小到大存放在一片相邻的连续区域,定义了存储结构 D、顺序表:按索引值从小到大存放在一片相邻的连续区域,定义了存储结构

2.下列说法正确的是:AB
A.如果函数f(n)是O(g(n)),g(n)是O(h(n)),那么f(n)是O(h(n))
B.如果函数f(n)是O(g(n)),g(n)是O(h(n)),那么f(n)+g(n)是O(h(n))
C.如果a>b>1,是,logan是O(logbn),但logbn不一定是O(logan)
D.函数f(n)是O(g(n)),当常数a足够大时,一定有函数g(n)是O(af(n))

解析: A、(1) 根据O()定义可知. B、(2) 如果f(n)是O(g(n)),g(n)是O(h(n)), 则f(n)是O(h(n)),所以f(n)+g(n)是O(h(n)) C、(3)logan=log(n)/log(a),logbn=log(n)/log(b),所以前者与后者只差了一个常数项,所以logbn一定是O(logan) D、(4)当f(n)=n,g(n)=n*2, 无论a多大,g(n)都不可能是O(af(n)).

3.由大到小写出以下时间复杂度的序列:(5)(1)(2)(4)(3)请添加图片描述

解析: 计算复杂度时,系数是可以忽略的。(5)和(1)是指数级复杂度,大于(2)(3)(4)多项式级复杂度,区别在于指数中是否有n。而(5)的指数里还有指数级复杂度的表达式,(1)的指数是n,为多项式级,故(5)比(1)复杂。对于(2)(3)(4),(2)的指数最大,为2.5,(4)的指数居中,为2,(3)的指数最小,解释如下:logn的任意实数次方的复杂度都小于n,故(logn)4比n复杂度低,故n*(logn)4比n*n复杂度低,故(4)比(3)复杂,故答案为(5)(1)(2)(4)(3)

4.已知一个数组a的长度为n,求问下面这段代码的时间复杂度: B
在这里插入图片描述
A.Ω(n^2)
B.O(n^2)
C.θ(n^2)
D.O(n)

解析: A、本代码实际上是求a中有序子数组中最长的长度。譬如,在[1, 8, 1, 2, 5, 0, 11, 9]中,最长的是[1, 2, 5],长度为3 。其时间复杂度与a中元素的实际取值状态相关。 1)若a的所有元素是按照降序方式排列。则外层循环n-1次,每次内层只执行一次,整个开销为θ(n) 2)若a的所有元素是按照升序方式排列。则外层循环n-1次,每次内层需要执行n-i-1次,整个开销为θ(n^2) 所以,一般来说,时间复杂度是Ω(n)的,也是O(n^2)

### 关于南京邮电大学数据结构MOOC第六章作业 针对南京邮电大学数据结构MOOC课程中的第六章作业,虽然具体题目未直接提供[^1],通常这类课程会围绕特定的数据结构主题展开练习。根据常见的教学大纲推测,第六章可能涉及栈、队列及其应用。 #### 可能覆盖的主题 - **栈的应用** - 表达式求值 - 迷宫问题求解 - **队列的应用** - 生产者消费者模型实现 - 图的广度优先遍历 考虑到上述可能性,下面给出一个关于表达式求值的例子作为示例: ```c++ #include <iostream> #include <stack> using namespace std; bool isOperator(char c){ return (!isdigit(c)); } int operate(int a, int b, char op){ switch(op){ case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; } return -1; } // 中缀转后缀并计算结果 string infixToPostfix(string s){ stack<char> st; string result = ""; for(auto& ch : s){ if(isdigit(ch)){ result += ch; }else if(isOperator(ch)){ while(!st.empty() && st.top() != '(' && ((ch=='*' || ch=='/') ? (st.top()=='*' || st.top()=='/') : true)) { result += st.top(); st.pop(); } st.push(ch); }else if(ch == '('){ st.push('('); }else if(ch == ')'){ while(st.top() != '('){ result += st.top(); st.pop(); } st.pop(); // pop '(' } } while(!st.empty()){ result += st.top(); st.pop(); } cout << "后缀表达式:" << result << endl; return result; } void evaluateExpression(const string &postfixExpr) { stack<int> values; for (char token : postfixExpr) { if (isdigit(token)) { values.push(token - '0'); } else { int val2 = values.top(); values.pop(); int val1 = values.top(); values.pop(); int res = operate(val1, val2, token); values.push(res); } } cout << "最终结果:" << values.top() << endl; } ``` 此代码展示了如何将中缀表达式转换成后缀形式,并对其进行评估得到数值结果。这属于典型的栈操作应用场景之一,在许多教材在线课程里都会被提及到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值