📌  相关文章
📜  实现直接寻址表的Java程序

📅  最后修改于: 2022-05-13 01:55:16.600000             🧑  作者: Mango

实现直接寻址表的Java程序

数据结构主要用于存储数据和管理大量数据,高效的数据结构有助于开发更好的算法。对数据结构执行的主要操作是插入、搜索、更新和删除。随着数据量的增加,所有这些操作往往会花费大量时间。

在某些情况下,我们希望在 O(1) 时间内(即恒定时间)执行所有这些操作。为了实现这一点,我们有一个称为直接寻址表的数据结构。

直接寻址表是一种随机数据结构,它使用数组将记录与其对应的唯一键进行映射。在直接地址表中,记录的键直接用作索引。这有助于快速高效的插入、搜索和删除操作。

以下操作可以在 O(1) 时间内完成:

  1. 插入:在数组的索引处插入元素需要 O(1) 时间。同样,对于插入元素,键用作索引。
  2. 搜索:使用键值作为索引可以更快地搜索任何记录。
  3. 删除:要从直接地址表中删除元素,请将索引/位置设置为指向空。

例子

假设我们的任务是为特定部门的大学生数据创建和维护目录,每个部门最多可容纳 70 名学生。每个学生都有一个分配给他/她的唯一卷号。任务是有效地存储每个学生的完整信息。现在,我们可以使用学生的卷号作为键将他/她的数据放在该索引中。首先,我们创建一个大小为 70 的数组 arr,它将作为我们的直接地址表。

假设我们插入卷号为 13 的学生数据,我们使用 13 作为索引并将该学生的数据插入到 arr[13]。插入另一个学生的卷号为 18 的数据,我们使用 18 作为索引并将该学生的数据插入到 arr[18]。下图是正在执行的插入操作的表示。

使用数组的直接寻址表

现在,考虑我们要检索卷号为 18 的学生的信息,我们可以直接使用 18 作为索引并在 arr[18] 处获取该学生的数据。这种地址表查找方法可以在 O(1) 时间内访问数据。假设我们要删除卷号为 13 的学生的信息(可能是因为他离开了大学),使用 13 作为索引,并通过将其设置为 null 来删除该学生在 arr[13] 处的数据。

但是使用这种数据结构有一些限制

  1. 键必须是整数/可以转换为整数。
  2. 所有的键都必须是唯一的。
  3. 整数键的范围应该相对较小(否则我们将需要大量内存)
  4. 整数键应该相对足够接近(否则会有更多的空槽和内存浪费)

执行:

我们来看上面例子的实现:

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