1、为整数列表定义一个抽象数据类型(ADT)。首先,确定该ADT应提供的功能。然后,以抽象类声明的形式用Java指定该ADT,展示函数、参数和返回类型。
整数列表的ADT可提供以下功能:在列表特定位置插入新整数、判断列表是否为空、重新初始化列表、返回列表中当前整数的数量、删除列表特定位置的整数。以下是用Java以抽象类声明形式指定的ADT:
```java
abstract class IntegerListADT {
// 在指定位置插入整数
public abstract void insert(int position, int value);
// 判断列表是否为空
public abstract boolean isEmpty();
// 重新初始化列表
public abstract void reinitialize();
// 返回列表中当前整数的数量
public abstract int size();
// 删除指定位置的整数
public abstract void delete(int position);
}
##2、简要描述整数变量在计算机中通常是如何表示的。为什么这种整数表示方法符合数据结构的定义?
- 整数变量在计算机中通常用反码和补码等方式表示。
- 反码是对原码除符号位外各位取反;
- 补码是在反码基础上加1。
- 这种表示方法符合数据结构的定义,因为数据结构是抽象数据类型(ADT)的实现。
- 整数的数学概念及操作构成数据类型;
- 计算机中整数的表示及相应操作构成ADT;
- 而这种具体的表示方式就是该ADT的实现,所以可看作是一种数据结构。
##3、为二维整数数组定义一个抽象数据类型(ADT),精确指定可以对这类数组执行的基本操作。然后,设想一个应用程序要存储一个1000行1000列的数组,其中非零值少于10000个。描述两种比需要一百万个位置的标准二维数组实现更节省空间的数组实现方法。
### 二维整数数组的ADT定义及基本操作
#### ADT定义
二维整数数组的ADT可以定义为一个包含整数元素的二维结构,支持以下基本操作:
1. **初始化**:创建一个指定行数和列数的二维整数数组。
2. **访问元素**:根据给定的行索引和列索引,返回对应位置的整数值。
3. **修改元素**:根据给定的行索引和列索引,修改对应位置的整数值。
4. **获取行数**:返回二维数组的行数。
5. **获取列数**:返回二维数组的列数。
### 更节省空间的实现方法
#### 稀疏矩阵实现
由于数组中大部分元素为零,可以使用稀疏矩阵来存储非零元素。具体实现可以使用三元组表,每个三元组包含行索引、列索引和非零元素的值。这样可以避免存储大量的零元素,从而节省空间。
#### 链表实现
可以使用链表来存储非零元素。每个链表节点包含行索引、列索引和非零元素的值。链表可以按行或列的顺序组织,这样可以在访问元素时快速定位。这种实现方式也可以避免存储大量的零元素,节省空间。
##4、假设你被分配去实现一个对数组的简单顺序搜索。问题是你希望这个搜索尽可能通用,这意味着你需要支持任意的记录和键类型。描述如何对搜索函数进行泛化以实现这一目标。考虑该函数在同一程序中多次用于不同记录类型的可能性,以及该函数需要用于同一记录的不同键(可能是相同或不同类型)的可能性。例如,一个学生数据记录可能会按邮政编码、姓名、薪水或平均绩点进行搜索。
- 为了实现通用的顺序搜索函数,可采用以下方法:
1. 使用泛型编程,允许函数处理不同类型的记录和键。
2. 传入比较函数,该函数定义了如何比较键值,这样可灵活处理不同类型的键。
3. 对于同一记录的不同键搜索,可让比较函数根据不同键进行相应比较。
- 通过这些方法,函数能在同一程序中多次用于不同记录类型,也能处理同一记录的不同键搜索。
##5、每个问题都有算法吗?
不是。存在一些计算问题,最好的算法运行时间很长,还有很多问题我们不知道是否存在高效算法,甚至存在根本无法解决的问题,所以并非每个问题都有算法。
##6、每个算法都有对应的 Java 程序吗?
任何现代计算机编程语言都可实现同一算法集合,Java 是现代编程语言,所以理论上每个算法都能有对应的 Java 程序。
##7、假设你受雇设计一个数据库服务,包含美国城市和城镇的信息。请为该数据库提出两种可能的实现方案。
- 可以使用k-d树和PR四叉树来实现该数据库。
- **使用k-d树时:**
- 每个数据库记录包含城市名称和城市坐标。
- 数据库应支持以下功能:
- 记录插入
- 按名称或坐标删除
- 按名称或坐标搜索
- 区域查询
- **使用PR四叉树时:**
- 每个数据库记录包含城市名称和坐标。
- 同样具备以下功能:
- 插入
- 删除
- 搜索
- 区域查询
##8、编译器和文本编辑器常见的一个问题是判断字符串中的括号(或其他括号符号)是否平衡且嵌套正确。例如,字符串“((())())()” 中的括号嵌套正确,但字符串 “)()(” 并非如此;字符串 “())” 也没有正确匹配的括号。(a) 给出一个算法,如果字符串中的括号嵌套平衡则返回 true,否则返回 false。提示:从左到右扫描合法字符串时,任何时候遇到的右括号数量都不会多于左括号。(b) 若字符串的括号嵌套和平衡不正确,给出一个算法返回第一个违规括号在字符串中的位置。也就是说,如果发现多余的右括号,返回其位置;如果左括号过多,返回第一个多余左括号的位置。如果字符串的括号平衡且嵌套正确,返回 -1。
(a) 可以使用栈来实现该算法。从左到右遍历字符串,遇到左括号时将其压入栈中,遇到右括号时,检查栈是否为空:
- 若栈为空,说明右括号多余,返回 `false`;
- 若栈不为空,则弹出栈顶的左括号。
遍历结