实现直接寻址表的Java程序
数据结构主要用于存储数据和管理大量数据,高效的数据结构有助于开发更好的算法。对数据结构执行的主要操作是插入、搜索、更新和删除。随着数据量的增加,所有这些操作往往会花费大量时间。
在某些情况下,我们希望在 O(1) 时间内(即恒定时间)执行所有这些操作。为了实现这一点,我们有一个称为直接寻址表的数据结构。
直接寻址表是一种随机数据结构,它使用数组将记录与其对应的唯一键进行映射。在直接地址表中,记录的键直接用作索引。这有助于快速高效的插入、搜索和删除操作。
以下操作可以在 O(1) 时间内完成:
- 插入:在数组的索引处插入元素需要 O(1) 时间。同样,对于插入元素,键用作索引。
- 搜索:使用键值作为索引可以更快地搜索任何记录。
- 删除:要从直接地址表中删除元素,请将索引/位置设置为指向空。
例子
假设我们的任务是为特定部门的大学生数据创建和维护目录,每个部门最多可容纳 70 名学生。每个学生都有一个分配给他/她的唯一卷号。任务是有效地存储每个学生的完整信息。现在,我们可以使用学生的卷号作为键将他/她的数据放在该索引中。首先,我们创建一个大小为 70 的数组 arr,它将作为我们的直接地址表。
假设我们插入卷号为 13 的学生数据,我们使用 13 作为索引并将该学生的数据插入到 arr[13]。插入另一个学生的卷号为 18 的数据,我们使用 18 作为索引并将该学生的数据插入到 arr[18]。下图是正在执行的插入操作的表示。
现在,考虑我们要检索卷号为 18 的学生的信息,我们可以直接使用 18 作为索引并在 arr[18] 处获取该学生的数据。这种地址表查找方法可以在 O(1) 时间内访问数据。假设我们要删除卷号为 13 的学生的信息(可能是因为他离开了大学),使用 13 作为索引,并通过将其设置为 null 来删除该学生在 arr[13] 处的数据。
但是使用这种数据结构有一些限制:
- 键必须是整数/可以转换为整数。
- 所有的键都必须是唯一的。
- 整数键的范围应该相对较小(否则我们将需要大量内存)
- 整数键应该相对足够接近(否则会有更多的空槽和内存浪费)
执行:
我们来看上面例子的实现:
Java
// Java program to implement Direct Addressing Table
import java.util.*;
class Student {
int rollNumber;
String name, gender;
Student(int rollNumber, String name, String gender)
{
this.rollNumber = rollNumber;
this.name = name;
this.gender = gender;
}
}
class DirectAddressingTable {
public static void main(String[] args)
{
// We want to create a catalogue of college students of some division
// Each division has atmost 70 students and roll number starts from 1
// Create "Direct Addressing Table" (catalogue) for the students' data
Student[] catalogue = new Student[71];
// Insert some students' data into the catalogue
insert(catalogue, new Student(11, "Rahul", "Male"));
insert(catalogue, new Student(18, "Joe", "Male"));
insert(catalogue, new Student(15, "Kavya", "Female"));
insert(catalogue, new Student(13, "Julia", "Female"));
// if the student with given rollnumber exists,
// then "search" function returns the record
// else returns null
Student student = search(catalogue, 18);
printInformation(18, student);
// delete student record with roll number 36
delete(catalogue, 13);
student = search(catalogue, 13);
// This will print "No student found" as we deleted
// the record
printInformation(13, student);
}
// Insert function to add student in the catalogue
public static void insert(Student[] catalogue,
Student student)
{
catalogue[student.rollNumber] = student;
}
// Search function to get the record of student from the
// catalogue
public static Student search(Student[] catalogue,
int rollNumber)
{
return catalogue[rollNumber];
}
// Delete function to remove the record of student from
// the catalogue
public static void delete(Student[] catalogue,
int rollNumber)
{
// As we are using arrays, we just will this
// location to point to null
catalogue[rollNumber] = null;
}
// Function to print student's information
public static void printInformation(int rollNumber,
Student student)
{
// print student information if record exists
if (student != null)
System.out.println( "Student with roll number " + rollNumber
+ " - Name: " + student.name
+ ", Gender: " + student.gender);
else
System.out.println( "No student found with roll number "
+ rollNumber);
}
}
Student with roll number 18 - Name: Joe, Gender: Male
No student found with roll number 13