时间复杂度分析
试分析下面各程序段的时间复杂度。
for (i=0; i<n; i++)
for (j=0; j<m; j++)
a[i][j]=0;
- A. O(1)
- B. O(n)
- C.O(n2)
-
D.O(m*n)
-
答案选D 从0-n 再从0-m 所有O(m*n)
-
试分析下面各程序段的时间复杂度。
i=1; - while(i<=n)
- i=i*3;
- A. O(1)
- B. 0(n)
- C. O(n2)
- D.O(log3n)
- 答案选D,令循环次数为x,则循环x次后i=3^x,当3^x大于n,即x>log3n时候跳出循环
经典题型:
分析下面各程序段的时间复杂度计算机保研,计算机考研国家线,计算机考研需要考哪些科目,计算机考研院校推荐,计算机考研学校排名,计算机考研科目,计算机考研,计算机考研大纲,计算机专业考研,计算机考研专业课,计算机408考研科目,计算机考研机试,软件工程考研,考研真题https://noobdream.com/Practice/article/155/算法分析的两个主要方面是(时间复杂度 空间复杂度)
线性表
设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( D )最节省时间。
- A. 单链表
- B. 单循环链表
- C. 带尾指针的单循环链表
- D. 带头指针的双循环链表
答案选D,
带尾指针的单向链表:插入可以,但是删除无法完成,因为p需要前移,但是单向链表无法得到前一个节点。(因为尾指针需要指向最后一个,你把最后一个删除之后,尾指针需要指向倒数第二个,这个时候找不到倒数第二个,所以删除不行)
带尾指针的双向链表:插入和删除都很简单。
带尾指针的单向循环链表:插入很简单,删除则需要遍历整个链表,比较费时。
带头指针的双向循环链表:插入和删除都很简单。
重点在于避免遍历整个链表
在一个具有n 个结点的有序单链表中插入一个新结点并仍然保持有序的时间复杂度是_O(n)__。
有序指在单链表中指定位置插入指定元素的时间复杂度,长度为n单链表中找到指定位置时间复杂度为O(n),插入元素时间复杂度O(1),加起来是O(n)
若带头结点的单链表的头指针为head,则该链表为空的判定条件是( head->next==NULL )
在一个长度为n的顺序表中删除第i个元素,要移动___n-i____个元素。
如果要在第i个元素前插入一个元素,要后移___n-i+1______个元素。
一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( 108 )。
公式=首元素存储空间+(第n个元素-第1个元素)*长度
100+(5-1)*2=108
在一个单链表中,若删除p所指向结点的后续结点,则执行(p->next=p->next->next )。
或者 :q = p->next; // q记录欲删除的结点
p = p->next->next; // 跨过欲删除的结点,也可写作 p->next = q->next
free(q); // 释放该结点占用的空间
逻辑顺序,先解决q前或后结点 与q的链接关系,再进行p与q的链接,避免断链出现。
在双向循环链表中,在p指针所指的结点后插入一个指针q所指向的新结点,修改指针的操作是( q->prior=p;q->next=p->next;p->next->prior=q;p->next=q; )。
在双向循环链表中,在p指针所指的结点前插入一个指针q所指向的新结点,修改指针的操作是(p->prior->next=q;q->prior=p->prior;p->prior=q;q->next=p; )。
栈和队列
在一个栈顶指针为 HS 的链栈中,将一个S指针所指的结点入栈, 应执行下列 ( C )命令。
- A. HS->next=S
- B. S->next=HS->next, HS->next=S
- C. S->next=HS,HS=S
- D. S->next=HS, HS=HS->next
- 答案选C,题目问的是压栈。s插入后成为栈顶,s的next就是原来的HS,栈顶指针重新复制为s。
队列和栈的区别
循环队列具体讲解:
循环队列的入队出队-----数据结构与算法笔记_王先生的蒋小姐的博客-CSDN博客_循环队列入队出队一、循环队列参考书:《数据结构(C语言)》–严蔚敏等编著,清华大学出版社。https://blog.csdn.net/weixin_44847002/article/details/121881554Q.rear尾指针始终指向下一个队尾入队的位置,并非指向一个元素
循环队列题目实战:
判断一个