【Weiss】【第03章】练习3.11:比较单链表递归与非递归查找元素
2015-03-17 20:48
204 查看
【练习3.11】
编写查找一个单链表特定元素的程序。分别用递归和非递归实现,并比较它们的运行时间。
链表必须达到多大才能使得使用递归的程序崩溃?
Answer:
实现都是比较容易的,但是实际上查找链表元素本身也没必要使用递归的方法。
考虑到题目让人比较运行时间与程序崩溃的边界,可以认为这是警示大家不要滥用递归的题目【【
毕竟在算法本身足够简单的时候,递归压栈会浪费大量额外空间与时间。
个人设备实测下,链表长度约5000时递归查找即崩溃,而迭代可在1000000长度的链表下正确运行。
测试代码如下:
View Code
实现代码如下:
其中,find_recursive在模板内声明为public,使用时调用该函数。而findr在模板内为private,是实际运算的执行者。
编写查找一个单链表特定元素的程序。分别用递归和非递归实现,并比较它们的运行时间。
链表必须达到多大才能使得使用递归的程序崩溃?
Answer:
实现都是比较容易的,但是实际上查找链表元素本身也没必要使用递归的方法。
考虑到题目让人比较运行时间与程序崩溃的边界,可以认为这是警示大家不要滥用递归的题目【【
毕竟在算法本身足够简单的时候,递归压栈会浪费大量额外空间与时间。
个人设备实测下,链表长度约5000时递归查找即崩溃,而迭代可在1000000长度的链表下正确运行。
测试代码如下:
#include <iostream> #include "linklist.h" using linklist::List; using namespace std; int main(void) { List<int> number; for (int i = 0; i < 10; ++i) number.additem(i); //测试两种查找的结果 cout << (number.find(1) == number.find_recursive(1)) << endl; cout << (number.find(3) == number.find_recursive(3)) << endl; cout << (number.find(7) == number.find_recursive(7)) << endl; cout << (number.find(8) == number.find_recursive(8)) << endl; //通过调整循环次数,确定链表多长时递归会溢出 for (int i = 0; i < 4500; ++i) number.additem(20); number.additem(40); //取消下面两种查找的注释,测试各自在多长的链表下能够运行 //在个人的设备上,迭代算法循环百万次后仍可运行 //而递归算法约5000次时即会溢出 //number.find(40); //number.find_recursive(40); system("pause"); }
View Code
实现代码如下:
//练习3.11新增,递归查找链表元素 template <typename T> Node<T>* List<T>::find_recursive(const T &item) { return findr(item, front); } template<typename T> Node<T>* List<T>::findr(const T &item, Node<T>* pos) { if (pos == nullptr || pos->data == item) return pos; else return findr(item, pos->next); }
其中,find_recursive在模板内声明为public,使用时调用该函数。而findr在模板内为private,是实际运算的执行者。
相关文章推荐
- 《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)
- 《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(非递归)
- 【Weiss】【第03章】练习3.3:通过交换指针交换单/双链表元素
- java实现单向链表CRUD,反转,排序,查找倒数第k个元素,递归输出等操作
- 【Weiss】【第03章】练习3.4、3.5:有序链表求交、并
- 【Weiss】【第03章】练习3.16:删除相同元素
- 链表中递归查找元素,非递归查找元素 以及基数排序(未完成)josephus问题(未完成)
- 编写查找一个单链表特定元素的程序。分别使用递归和非递归方法实现,并比较它们的运行时间。
- 【Weiss】【第03章】练习3.15:自调整链表
- 【练习8.1】查找轮廓、寻找关键点cvFindDominantPoints、访问序列中的元素
- 递推递归练习 P - M--二分查找
- 查找单链表中倒数第k个元素
- 3.单链表内元素的查找
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 设计模式之--迭代器模式(自定义迭代器与STL::find()配合查找链表元素)
- 数据结构 —— 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 尾插法、头插法创建链表、链表反转、链表分段反转、查找链表倒数第k个元素,查找链表中间元素
- 第九章中位数和顺序统计学之“查找第i小的元素(迭代版)平均运行时间为O(n)算法”(练习9.2-3)
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现