编程珠玑——第二章习题

2023-12-11 17:18
文章标签 编程 第二章 习题 珠玑

本文主要是介绍编程珠玑——第二章习题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、考虑查找给定输入单词的所有变位词的问题。仅给定单词和字典的情况下,如何解决该问题?如果有一些时间和空间可以在响应任何查询之前预先处理字典,又会如何?

答:现给每个单词做标记,然后给予某一规则对标记之后的单词排序(标记相同的单词相邻),最后将标记相同的单词归到某一集合(写在一行或者输出到某一个文件)。

在查找某一个单词的变位词的时候,先按相同的规则得到标记,然后根据标记的值找到某一行(或某一个文件)。


在有预处理的情况下,可以将上述算法的第一步和第二步预先处理;查询的时候只需要根据单词得到标记,查询结果就行。(相当于copy了一份字典,并将copy的字典改造成可查询变位词的格式)。


2、给定包含4 300 000 000个32位整数的顺序文件,如何找出一个出现至少两次的整数?

答:1,2,3,3,4,5....这样的可以用二分查找

3、前面涉及了两个需要精巧代码来实现的向量旋转算法。将其分别作为独立的程序实现。在每个程序中,i和n的最大公约数如何出现?

答:

方法一:海豚算法

[cpp]  view plain copy
  1. void Shifting(char * pArry, int rotdistance, int len)  
  2. {  
  3.     int i, j;  
  4.     char temp;  
  5.     int igcd = gcd(rotdistance, len);   
  6.     for (i = 0; i < igcd; i++)  
  7.     {  
  8.         temp = pArry[i];  
  9.         j = i;  
  10.         for (; ;)  
  11.         {  
  12.             int k = j + rotdistance;  
  13.             k %= len;  
  14.             if ( k == i)  
  15.             {  
  16.                 break;  
  17.             }  
  18.             pArry[j] = pArry[k];  
  19.             j = k;  
  20.         }  
  21.         pArry[j] = temp;  
  22.     }  
  23. }  

     方法二:块交换算法

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. //交换pArry[a...a+m-1]和pArry[b...b+m-1]  
  5. void myswap(char *pArry, int a, int b, int m)  
  6. {  
  7.     char temp;  
  8.     for (int i = 0; i < m; i++)  
  9.     {  
  10.         temp = pArry[a + i];  
  11.         pArry[a + i] = pArry[b + i];  
  12.         pArry[b + i] = temp;  
  13.     }  
  14.   
  15. }  
  16.   
  17. void Shifting(char * pArry, int rotdistance, int len)  
  18. {  
  19.     if (rotdistance == 0 || rotdistance == len)   
  20.     {  
  21.         return;  
  22.     }  
  23.   
  24.     int i, j, p;  
  25.     i = p = rotdistance;  
  26.     j = len - p;  
  27.   
  28.     while (i != j)  
  29.     {  
  30.         if (i > j)  
  31.         {  
  32.             myswap(pArry, p - i, p, j);  
  33.             i -= j;  
  34.         }  
  35.         else  
  36.         {  
  37.             myswap(pArry, p - i, p + j - i, i);  
  38.             j -= i;  
  39.         }  
  40.     }  
  41.     myswap(pArry, p - i, p, i);  
  42. }  
  43.   
  44. int _tmain(int argc, _TCHAR* argv[])  
  45. {  
  46.     char arry[] = "abcdefghijklmn";  
  47.     int len = strlen(arry);  
  48.     Shifting(arry, 10, len);  
  49.     return 0;  
  50. }  

     方法三:求逆算法

     根据矩阵的转置理论,对于矩阵AB,要得到BA,则分别求A和B的转置A', B',然后对(A'B')转置,即(A'B')' = BA。同理,可以得到另一种一维向量向左旋转的算法。将要被旋转的向量x看做两部分ab,这里a代表x中的前rotdistance个元素。首先对a部分进行反转,再对b部分进行反转,最后对整个向量x进行反转即可。

    对于字符串“abcdefgh”, rotdistance = 3, len = 8:

    reverse(1, rotdistance);          //cbadefgh

    reverse(rotdistance+1, len);  //cbahgfed

    reverse(1, len);                       //defghabc

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. //对字符串中第i个字符到第j个字符进行反转,i、j>=1  
  5. void MyReverse(char * pArry, int i, int j)  
  6. {  
  7.     int front = i;  
  8.     int tail = j;  
  9.     char temp;  
  10.     while (front != tail && front < tail)  
  11.     {  
  12.         temp = pArry[front - 1];  
  13.         pArry[front - 1] = pArry[tail - 1];  
  14.         pArry[tail - 1] = temp;  
  15.         ++front;  
  16.         --tail;  
  17.     }  
  18. }  
  19.   
  20. //将字符串左旋转rotdistance个字符  
  21. void Shifting(char * pArry, int rotdistance, int len)  
  22. {  
  23.     if (rotdistance == 0 || rotdistance == len)  
  24.     {  
  25.         return;  
  26.     }  
  27.     MyReverse(pArry, 1, rotdistance);  
  28.     MyReverse(pArry, rotdistance + 1, len);  
  29.     MyReverse(pArry, 1, len);  
  30. }  
  31.   
  32. int _tmain(int argc, _TCHAR* argv[])  
  33. {  
  34.     char arry[] = "abcdefgh";  
  35.     int len = strlen(arry);  
  36.     Shifting(arry, 5, len);  
  37.     cout << arry << endl;  
  38.     return 0;  
  39. }  

4、几位读者指出,既然所有的三个旋转算法需要的运行时间都正比于n,杂技算法那的运行速度显然是求逆算法的两倍。杂技算法对数组中的每个元素进存储和读取一次。而求逆算法需要两次。在实际的计算机上进行实验以比较两者的速度差异,特别注意内存引用位置附近的问题。

答:可以将bc看做一个整体,然后运用向量旋转算法,得到bca。然后对bc运用向量旋转算法,得到cb。最后变换后的向量为即cba.

5、向量旋转函数将向量ab变为向量ba。如何将向量abc变为cba?(这对交换非相邻内存块的问题进行了建模)


6、XXX。。。。要查询名字Mike Lesk.而已按“LESK*M*”(也就是“5375^*6*”),随后,系统会输出他的电话号码。这样的服务随处可见。现在的问题是,不同的名字可能具有相同的按键编码。在Lesk的系统中发生这种情况时,系统会询问永和更多的信息。给定一个大的名字文件(例如标准的大城市电话号码簿),如何定位这些“错误匹配”?(当Lesk在这种规模的电话号码簿上做实验时,他发现错误匹配发生的概率仅仅是0.2%)如何实现一个以名字的按键编码为参数,并返回所有可能的匹配名字的函数??


7、程序员需要转置一个存储在磁带上的4000*4000的矩阵(每条记录的格式相同,为数十个字节)。最初提出的程序需要运行50个小时。程序员是如何将运行时间减少到半小时的??


8、给定一个n元师叔集合,一个实数t和一个整数k,如何快速确定是否存在一个k元子集,其元素纸盒不超过t??


9、顺序搜索和二分搜索代表了搜索时间和预处理时间之间的折中。处理一个n元表格时,需要执行多少次二分搜索才能弥补对表进行排序所消耗的预处理时间?


10、爱迪生要求某人计算一个空灯泡壳的容积。在使用测径仪和微积分进行数小时的计算后,他给出了答案——150立方厘米。而爱迪生在几秒钟之内就计算完毕并给出了“更

接近155”。他是如何实现的???

这篇关于编程珠玑——第二章习题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/481460

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的