【练习3.15】

a.写出自调整表的数组实现。自调整表如同一个规则的表,但是所有的插入都在表头进行。

当一个元素被Find访问时,它就被移到表头而并不改变其余的项的相对顺序。

b.写出自调整表的链表实现

c.设每个元素都有其被访问的固定概率pi。证明那些具有最高访问概率的元素都靠近表头。

Answer:

a简单得令人发指,所以不写了。

b只需要在原链表上加一个自适应的Find访问版本find_selfadj就行,很简单,如下代码。

c在摊还分析那里会频繁遇到的,这儿超纲了。

测试代码:

  1. #include <iostream>
  2. #include "linklist.h"
  3. using namespace std;
  4. using namespace linklist;
  5. template class List<int>;
  6. int main(void)
  7. {
  8. List<int> number;
  9.  
  10. //测试插入
  11. cout << "/*additem()*/" << endl;
  12. number.additem();
  13. number.additem();
  14. number.additem();
  15. number.additem();
  16. number.additem();
  17. number.additem();
  18. number.traverse();
  19. cout << "\n/*end*/\n\n" << flush;
  20.  
  21. number.find_selfadj();
  22. number.traverse();
  23. cout << "\n/*end*/\n\n" << flush;
  24.  
  25. number.find_selfadj();
  26. number.traverse();
  27. cout << "\n/*end*/\n\n" << flush;
  28.  
  29. system("pause");
  30. }

实现代码:

  1. //练习3.15新增,自调整表链表实现
  2. template <typename T> Node<T>* List<T>::find_selfadj(const T &item)
  3. {
  4. Node<T>* iter = find_prev(item);
  5. //如元素不存在或元素为头元素,则操作与一般查找完全一致
  6. if (length == )
  7. return nullptr;
  8. else if (front->data == item)
  9. return front;
  10. //否则,调整指针将元素放到头部
  11. else
  12. {
  13. //保存断开位置的后继
  14. Node<T>* temp = iter->next->next;
  15. //断开节点后继为头节点
  16. iter->next->next = front;
  17. //头节点更换
  18. front = iter->next;
  19. //接上断开位置
  20. iter->next = temp;
  21. //如果断开处为链表尾则调整尾节点
  22. if (temp == nullptr)
  23. rear = iter;
  24. return front;
  25. }
  26. }

【Weiss】【第03章】练习3.15:自调整链表的更多相关文章

  1. 第03章 AOP前奏

    第03章 AOP前奏 提出问题 ●情景:数学计算器 ●要求 ①执行加减乘除运算 ②日志:在程序执行期间追踪正在发生的活动 ③验证:希望计算器只能处理正数的运算 ●常规实现 ●问题 ○代码混乱:越来越多 ...

  2. 第03章_基本的SELECT语句

    第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖 ...

  3. suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件

    文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...

  4. 15:链表中倒数第K个节点

    /** * 面试题15:链表中倒数第K个节点 * 输入一个链表,输出该链表中倒数第k个结点. */ public class _15_linked_K { public static void mai ...

  5. 【Weiss】【第03章】增补附注

    基本上每章到增补附注这里就算是结束了. 根据设想,每章的这一篇基本上会注明这一章哪些题没有做,原因是什么,如果以后打算做了也会在这里补充. 还有就是最后会把有此前诸多习题的代码和原数据结构放整理后,以 ...

  6. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

  7. 【Weiss】【第03章】练习3.16:删除相同元素

    [练习3.16] 假设我们有一个基于数组的表A[0,1...N-1],并且我们想删除所有相同的元素. LastPosition初始值为N-1,但应该随着相同元素被删除而变得越来越小. 考虑图3-61中 ...

  8. 【Weiss】【第03章】练习3.26:双端队列

    [练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. ...

  9. 【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题

    [练习3.22] a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin 返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1). b.证明,如果 ...

随机推荐

  1. $random 函数用法

    $random函数调用时,返回一个32位的随机数,它是一个带符号的整形数.如下例: reg[23:0] rand; rand = $random % 60; //产生一个在 -59~59 范围的随机数 ...

  2. 吴裕雄--天生自然python学习笔记:Python3 XML 解析

    什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. XML 被设计用来传输和存 ...

  3. spring和hibernate的集成

    集成关系图: 项目目录树: User.java package com.donghai.bean; public class User { private String id; private Str ...

  4. RxJS学习笔记之Subject

    本文为原创文章,转载请标明出处 目录 Subject BehaviorSubject ReplaySubject AsyncSubject 1. Subject 总的来说,Subject 既是能够将值 ...

  5. javaWeb简单登录实现验证数据库

    用户登录案例需求: 1.编写login.html登录页面 username & password 两个输入框 2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表 ...

  6. Selenium的Web自动化测试(送源码)

    8.1  Selenium自动化测试准备 1.Selenium介绍 Selenium是一个Web开源自动化测试框架,页面级操作,模拟用户真实操作,API从系统层面触发事件. Selenium 1.0  ...

  7. 根据现有的数据库自动生成Django model

    Django引入外部数据库还是比较方便的,首先在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自动生成models模型文件 python ma ...

  8. Java NIO-09-零拷贝之 DMA

    DMA 的好处 在介绍DMA之前我想问大家:我们为什么要引入DMA,DMA对我们有什么好处那? 计算机系统中各种常用的数据输入/输出方法有查询方式(包括无条件及条件传送方式)和中断方式,这些方式适用于 ...

  9. json_encode在设计api时需要注意的问题

    1. 在设计api时我们经常会使用关联数组,例如:我要返回给客户端主题信息和主题包列表 原始数组格式 $arr = array( 100=>array('themeName'=>'a',' ...

  10. 微软亚洲研究院的“哈利·波特”:Thomas Moscibroda

    在微软亚洲研究院,有一位名为Thomas Moscibroda的研究员几乎是无人不知.无人不晓,江湖人送外号"哈利·波特".Thomas认为他这么"红"是因为他 ...