使用二进制搜索的 Java 前缀搜索

Posted

技术标签:

【中文标题】使用二进制搜索的 Java 前缀搜索【英文标题】:Java Prefix Search with binary search 【发布时间】:2014-04-03 15:28:31 【问题描述】:

我一直在尝试使用 java 的二进制搜索方法在单词数组(词典)中搜索特定字符串,然后确定该字符串是单词、前缀还是不是单词。如果返回的索引大于或等于零,则字符串是一个单词。如果返回的索引小于零,那么我必须确定它是不是单词,还是前缀。

例如,例如,当查找“ela”时,返回的值可能是 -137。这意味着“ela”不在词典中,但如果要插入它,它将在索引 136 处。这也意味着如果索引 136 处的单词不以“ela”开头,则词典中没有单词“ela”的前缀。因此,binarySearch 返回的任何非负值都意味着单词的状态是 LexStatus.WORD。如果返回的值为负数,则调用适当的 String.startsWith() 方法可以确定是否应返回 LexStatus.PREFIX(确保在调用startsWith 时不要超出词典中单词数组的末尾) .

到目前为止,我编写的代码如下所示。我通过了 .isWord() 和 .isNotWord() 的 J 单元测试;但是我没有通过 .isPrefix() 测试,我目前将前缀标记为非单词。你们能帮我找出我的错误吗?

    public LexStatus wordStatus(String s) 
    String [] myWordsArray = new String[myWords.size()];
    myWords.toArray(myWordsArray);
    int wordIndex= Arrays.binarySearch(myWordsArray,s);
    if(wordIndex>=0)
        return LexStatus.WORD;
    
    else
        int checkIndex = (wordIndex*-1)+1;
        if(checkIndex<=myWords.size()-1)
            String precedingWord= myWords.get(checkIndex);
            String check1=precedingWord.toLowerCase();
            String check2= s.toLowerCase();
            if(check1.startsWith(check2))
                return LexStatus.PREFIX;
            
            return LexStatus.NOT_WORD;
        
        return LexStatus.NOT_WORD;
        

【问题讨论】:

wordIndex*-1-wordIndex的路很长 有人没有做作业...APCS? 能否详细说明? 【参考方案1】:

您计算的 checkIndex 不正确。

binarySearch 的文档中你知道wordIndex = (-(insertion point) - 1)。因此wordIndex+1 = -(insertion point),所以在翻转注册后得到-(wordIndex+1) = insertion point

int checkIndex = -(wordIndex+1);

您的代码以相反的顺序进行否定和加法,因此您的代码检查了一个错误的单词。

注意:您在checkIndex 看到的单词是跟随 的单词,而不是之前s 按字典顺序排列的单词。因此,您应该将precedingWord 变量重命名为nextWord

【讨论】:

以上是关于使用二进制搜索的 Java 前缀搜索的主要内容,如果未能解决你的问题,请参考以下文章

在java中使用线性和二进制搜索的用户输入

Java ArrayList 中的 contains() 方法是不是使用二进制搜索?

java 270.最近的二进制搜索树值(#)。java

java 270.最近的二进制搜索树值(#)。java

java 270.最近的二进制搜索树值(#)。java

java 270.最近的二进制搜索树值(#)。java