Bagaimana cara menerapkan Pelengkapan Otomatis menggunakan Trie dengan HashMap?

Berikut di bawah ini adalah kode dengan implementasi HashMap dari Trie. Tapi saya tidak yakin bagaimana menerapkan bagian pelengkapan otomatis. Saya melihat bagaimana orang menggunakan LinkedList untuk mengimplementasikan Trie, tapi saya ingin memahami dengan HashMap. Bantuan apa pun dihargai. Saya telah menempelkan kode di bawah ini untuk Trie saya.

Apakah ada cara untuk mencari awalan, lalu pergi ke akhir awalan dan mencari turunannya dan mengembalikannya sebagai string? Dan jika demikian, bagaimana cara mencapainya dengan menggunakan implementasi HashMap. Atau sebaiknya saya tidak melakukan ini dengan HashMap dan menggunakan LinkedList. Dan saya tidak yakin, mengapa yang satu lebih baik dari yang lain?

public class TrieNode {

    Map<Character, TrieNode> children;
    boolean isEndOfWord;

    public TrieNode() {
        isEndOfWord = false;
        children = new HashMap<>();
    }

}

public class TrieImpl {

    private TrieNode root;

    public TrieImpl() {
        root = new TrieNode();
    }

    // iterative insertion into Trie Data Structure
    public void insert(String word) {
        if (searchTrie(word))
            return;

        TrieNode current = root;
        for(int i=0; i<word.length(); i++) {
            char ch = word.charAt(i);
            TrieNode node = current.children.get(ch);
            if(node == null) {
                node = new TrieNode();
                current.children.put(ch, node);
            }
            current = node;
        }
        current.isEndOfWord = true;
    }

    // search iteratively
    public boolean searchTrie(String word) {
        TrieNode current = root;
        for(int i=0; i < word.length(); i++) {
            char ch = word.charAt(i);
            TrieNode node = current.children.get(ch);
            if(node == null) {
                return false;
            }
            current = node;
        }
        return current.isEndOfWord;
    }


    // delete a word recursively
    private boolean deleteRecursive(TrieNode current, String word, int index) {

        if(index == word.length()) {
            if(!current.isEndOfWord) {
                return false;
            }
            current.isEndOfWord = false;
            return current.children.size() == 0;
        }
        char ch = word.charAt(index);
        TrieNode node = current.children.get(ch);

        if(node == null) {
            return false;
        }

        boolean shouldDeleteCurrentNode = deleteRecursive(node, word, index+1);

        if(shouldDeleteCurrentNode) {
            current.children.remove(ch);
            return current.children.size() == 0;
        }

        return false;
    }

    // calling the deleteRecursively function
    public boolean deleteRecursive(String word) {
        return deleteRecursive(root, word, 0);
    }

    public static void main(String[] args) {

        TrieImpl obj = new TrieImpl();

        obj.insert("amazon");
        obj.insert("amazon prime");
        obj.insert("amazing");
        obj.insert("amazing spider man");
        obj.insert("amazed");
        obj.insert("alibaba");
        obj.insert("ali express");
        obj.insert("ebay");
        obj.insert("walmart");

        boolean isExists = obj.searchTrie("amazing spider man");
        System.out.println(isExists);
    }
}

person Arjun Kalidas    schedule 11.04.2020    source sumber


Jawaban (1)


Saya sedang terburu-buru mencari solusi lain di sini, tapi ini pertanyaan yang menarik.

Menjawab ini-

Apakah ada cara untuk mencari awalan, lalu pergi ke akhir awalan dan mencari turunannya dan mengembalikannya sebagai string?

Ya, mengapa tidak, jika Anda memiliki awalan ama, sekarang buka metode searchTrie Anda, dan setelah selesai dan keluar dari loop. kemudian, Anda memiliki variabel current yang menunjuk ke a(karakter terakhir dari ama)

Anda kemudian dapat menulis metode seperti di bawah ini -

    public List<String> getPrefixStrings(TrieNode current){
           // DO DFS here and put all character with isEndOfWord = true in the list
           // keep on recursing to this same method and adding to the list
           // then return the list

    }
person anubhs    schedule 16.04.2020
comment
Terima kasih @anubhs, saya akan mencoba pendekatan itu. - person Arjun Kalidas; 18.04.2020