• 查找算法简单应用


    1.线性表索引中的倒排索引,用在ElasticSearch中,产品就是搜索引擎,例如百度搜索、淘宝的商品搜索。

    2.顺序表查找。String.contains()方法中用到顺序表查找。

    //用于判断源字符串是否包含目标字符序列 CharSequence s
     public boolean contains(CharSequence s) {
             //调用indexOf(String str)方法
            return indexOf(s.toString()) > -1;
        }
    
    indexOf (String str)
        public int indexOf(String str) {
        //继续往下调用indexOf(String str, int fromIndex)方法,并传入匹配起始下标
            return indexOf(str, 0);
        }
    
    indexOf (String str, int fromIndex)
        public int indexOf(String str, int fromIndex) {
            //继续往下调用indexOf(char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex) 函数
            //传入源字符串,源字符串偏移量,源字符串长度,目标字符串,目标字符串偏移量,目标字符串长度,匹配源字符串的起始坐标
            return indexOf(value, 0, value.length,
                    str.value, 0, str.value.length, fromIndex);
        }
    
    indexOf (char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex)
    
    static int indexOf(char[] source, int sourceOffset, int sourceCount,
                char[] target, int targetOffset, int targetCount,
                int fromIndex) {
             //若匹配的起始下标大于或等于源字符串的长度
            if (fromIndex >= sourceCount) {
                //检测目标长度是否为0,是则返回源字符串长度,否则返回-1
                return (targetCount == 0 ? sourceCount : -1);
            }
            //若匹配的起始下标小于0
            if (fromIndex < 0) {
                //将匹配的起始下标置0
                fromIndex = 0;
            }
            //若目标字符串长度等于0
            if (targetCount == 0) {
                //直接返回匹配的起始下标
                return fromIndex;
            }
            //从定义的目标偏移量中取出目标字符串的第一个字符
            char first = target[targetOffset];
            //获取源字符串能被匹配的最大长度
            int max = sourceOffset + (sourceCount - targetCount);
            //从定义的偏移量加上起始匹配下标开始进行匹配
            for (int i = sourceOffset + fromIndex; i <= max; i++) {
                /* Look for first character. */
                //检测第一个字符是否相等
                if (source[i] != first) {
                    //不相等则循环匹配,直到找到能与目标字符串第一个字符匹配的源字符串下标。
                    while (++i <= max && source[i] != first);
                }
    
                /* Found first character, now look at the rest of v2 */
                //已经找到了与目标字符串第一个字符匹配的源字符串下标,则从该下标的下一位开始,对目标字符串余下的字符进行匹配。
                if (i <= max) {
                    //从该下标的下一位开始
                    int j = i + 1;
                    //定义本次匹配的最大长度
                    int end = j + targetCount - 1;
                    //循环匹配
                    for (int k = targetOffset + 1; j < end && source[j]
                            == target[k]; j++, k++);
                    //j能一直增加到end,说明已经成功匹配
                    if (j == end) {
                        /* Found whole string. */
                        //返回在源字符串中被匹配到的第一个字符的下标。
                        return i - sourceOffset;
                    }
                }
            }
            //没有匹配到,返回-1
            return -1;
        }

     从这个方法中可以看出,其采用的是最原始也是最笨的方法进行匹配,将目标字符串与源字符串的字符进行逐一匹配,若第一个字符匹配成功,则进行余下的匹配,若余下的匹配不成功,则从一开始目标字符串的第一个字符与源字符串匹配时的下标的下一位继续进行匹配。这样其实是浪费了很多没必要的时间。有关字符串匹配的快捷有效匹配算法,可以参照KMP算法。

    3.二分法查找。猜1—100之间的数字。

     

  • 相关阅读:
    Android通过包名启动应用程序
    android 通过反射方法获取状态栏高度
    Android在输入法界面监听按键(以返回键为例)
    Android主动弹出输入法
    Android使用内部类自定义控件
    Android中ListView列表Item的圆角效果实现
    Android中关于系统Dialog无法全屏的问题
    Dart学习记录(五)
    Dart学习记录(四)—— 库
    Dart学习记录(三)—— 泛型
  • 原文地址:https://www.cnblogs.com/aaaazzzz/p/12934432.html
Copyright © 2020-2023  润新知