2021-07-14

2021-常见问题收集整理-1

2021-常见问题收集整理-篇章1

 

    一往情深深几许?深山夕照深秋雨。

 

简介:2021-常见问题收集整理-篇章1,完善自身技能树,有备无患。

一、顺序查找和二分查找法的时间复杂度分别为多少?

二分查找VS顺序查找图

1、顺序查找

顺序查找的平均时间复杂度为O(logn),n 是待查数列的长度,因为顺序查找是从头到尾查找,而且是查找了整个数组。当然最好的情况是数组的第 1 个元素就是我们要找的元素,这样可以直接找到,最坏的情况是到最后一个元素时才找到或者没有找到要找的元素。

顺序查找代码:

 1 /** 2   * 顺序查找 3  */ 4 public class SequentialSearch { 5  private int[] array; 6  public SequentialSearch(int[] array) { 7   this.array = array; 8  } 9 10  /**11   * 直接顺序查找12   * @param key13   * @return14  */15  public int search(int key) {16   for (int i = 0; i < array.length; i++) {17    if (array[i] == key) {18    // 找到了的话返回数组下标19     return i;20    }21   }22   return -1;23  }24 }  

View Code

2、二分查找

二分查找的时间复杂度为O(logn),利用折半查找大大降低了比较次数,它是一种效率较高的查找方法(redis、kafka、B+树的底层都采用了二分查找法 )。

二分查找的使用前提是线性表已经按照大小排好了序。这种方法充分利用了元素间的次序关系,采用分治策略。基本原理是:首先在有序的线性表中找到中值,将要查找的目标与中值进行比较,如果目标小于中值,则在前半部分找,如果目标小于中值,则在后半部分找;假设在前半部分找,则再与前半部分的中值相比较,如果小于中值,则在中值的前半部分找,如果大于中值,则在后半部分找。以此类推,直到找到目标为止。 

二分查找代码:

 1 package com.bebird.pms.controller.test; 2  3 /** 4  * 二分查找 5  * 假设在 2,6,11,13,16,17,22,30中查找22 6 */ 7 public class BinarySearch { 8  9  /**10   * 1、首先找到中值:中值为13(下标:int middle = (0+7)/2),将22与13进行比较,发现22比13大,则在13的后半部分找;11   * 2、然后在后半部分 16,17,22,30中查找22,首先找到中值,中值为17(下标:int middle=(0+3)/2),将22与17进行比较,发现22比17大,则继续在17的后半部分查找;12   * 3、然后在17的后半部分 22,30查找22,首先找到中值,中值为22(下标:int middle=(0+1)/2),将22与22进行比较,查找到结果。13   * @param args14  */15  public static void main(String[] args) {16   int arr[] = {2, 6, 11, 13, 16, 17, 22, 30};17   System.out.println("非递归结果,22的位置为:" + binarySearch(arr, 22));18   System.out.println("递归结果,22的位置为:" + binarySearch(arr, 22, 0, 7));19  }20 21  /**22   * 非递归23   * @param arr24   * @param res25   * @return26  */27  static int binarySearch(int[] arr, int res) {28   int low = 0;29   int high = arr.length - 1;30   while (low <= high) {31    int middle = (low + high) / 2;32    if (res == arr[middle]) {33     return middle;34    } else if (res < arr[middle]) {35     high = middle - 1;36    } else {37     low = middle + 1;38    }39   }40   return -1;41  }42  43  /**44   * 递归45   * @param arr46   * @param res47   * @param low48   * @param high49   * @return50  */51  static int binarySearch(int[] arr, int res, int low, int high) {52 53   if (res < arr[low] || res > arr[high] || low > high) {54    return -1;55   }56   int middle = (low + high) / 2;57   if (res < arr[middle]) {58    return binarySearch(arr, res, low, middle - 1);59   } else if (res > arr[middle]) {60    return binarySearch(arr, res, middle + 1, high);61   } else {62    return middle;63   }64  }65 }

View Code

二、举例常见排序算法并说下快速排序法的过程,时间复杂度?

1、常见排序算法

八种常见排序算法:直接插入排序、希尔排序、简单选择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序。

算法详情链接:https://www.cnblogs.com/taojietaoge/p/13599081.html

 2、快排

快速排序使用分治的思想,从待排序序列中选取一个记录的关键字为key,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字不大于key,另一部分记录的关键字不小于key,之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

快速排序算法的基本步骤为(从小到大):

选择关键字:从待排序序列中,按照某种方式选出一个元素作为 key 作为关键字(也叫基准)。
置 key 分割序列:通过某种方式将关键字置于一个特殊的位置,把序列分成两个子序列。此时,在关键字 key 左侧的元素小于或等于 key,右侧的元素大于 key(这个过程称为一趟快速排序)。
对分割后的子序列按上述原则进行分割,直到所有子序列为空或者只有一个元素。此时,整个快速排序完成。

三、如何实现关键词输入提示功能?

使用字典树实现或HashMap。

1、Trie Tree简介

Trie Tree,又称单词字典树、查找树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。时间复杂度 : O(n),空间复杂度 : O(1)。

Trie Tree结构图

2、Trie Tree 性质

a. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
b. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
c. 每个节点的所有子节点包含的字符都不相同。

3、Trie Tree 分词原理

(1) 从根结点开始一次搜索,比如搜索【北京】;
(2) 取得要查找关键词的第一个字符【北】,并根据该字符选择对应的子树并转到该子树继续进行检索;
(3) 在相应的子树上,取得要查找关键词的第二个字符【京】,并进一步选择对应的子树进行检索。
(4) 迭代过程……
(5) 在直到判断树节点的isEnd节点为true则查找结束(最小匹配原则),然后发现【京】isEnd=true,则结束查找。

java 简单实现代码:

 1 import java.util.HashMap; 2 import java.util.LinkedList; 3 import java.util.List; 4 import java.util.Map; 5 import java.util.Map.Entry; 6  7 /** 8  * trie tree 9  * 正向最大匹配 10 */ 11 public class TrieTreeDemo { 12  static class Node { 13   //记录当前节点的字 14   char c; 15   //判断该字是否词语的末尾,如果是则为false 16   boolean isEnd; 17   //子节点 18   List<Node> childList; 19  20   public Node(char c) { 21    super(); 22    this.c = c; 23    isEnd = false; 24    childList = new LinkedList<Node>(); 25   } 26  27   //查找当前子节点中是否保护c的节点 28   public Node findNode(char c){ 29    for(Node node : childList){ 30     if(node.c == c){ 31      return node; 32     } 33    } 34  35    return null; 36   } 37  } 38  39  static class TrieTree{ 40   Node root = new Node(' '); 41  42   //构建Trie Tree 43   public void insert(String words){ 44    char[] arr = words.toCharArray(); 45    Node currentNode = root; 46    for (char c : arr) { 47     Node node = currentNode.findNode(c); 48     //如果不存在该节点则添加 49     if(node == null){ 50      Node n = new Node(c); 51      currentNode.childList.add(n); 52      currentNode = n; 53     }else{ 54      currentNode = node; 55     } 56    } 57    //在词的最后一个字节点标记为true 58    currentNode.isEnd = true; 59   } 60  61   //判断Trie Tree中是否包含该词 62   public boolean search(String word){ 63    char[] arr = word.toCharArray(); 64    Node currentNode = root; 65    for (int i=0; i<arr.length; i++) { 66     Node n = currentNode.findNode(arr[i]); 67     if(n != null){ 68      currentNode = n; 69      //判断是否为词的尾节点节点 70      if(n.isEnd){ 71       if(n.c == arr[arr.length-1]){ 72        return true; 73       } 74      } 75     } 76    } 77    return false; 78   } 79  80   //最大匹配优先原则 81   public Map<String, Integer> tokenizer(String words){ 82    char[] arr = words.toCharArray(); 83    Node currentNode = root; 84    Map<String, Integer> map = new HashMap<String, Integer>(); 85    //记录Trie Tree 从root开始匹配的所有字 86    StringBuilder sb = new StringBuilder();; 87    //最后一次匹配到的词,最大匹配原则,可能会匹配到多个字,以最长的那个为准 88    String word=""; 89    //记录记录最后一次匹配坐标 90    int idx = 0; 91    for (int i=0; i<arr.length; i++) { 92     Node n = currentNode.findNode(arr[i]); 93     if(n != null){ 94      sb.append(n.c); 95      currentNode = n; 96      //匹配到词 97      if(n.isEnd){ 98       //记录最后一次匹配的词 99       word = sb.toString();100       //记录最后一次匹配坐标101       idx = i;102      }103     }else{104      //判断word是否有值105      if(word!=null && word.length()>0){106       Integer num = map.get(word);107       if(num==null){108        map.put(word, 1);109       }else{110        map.put(word, num+1);111       }112       //i回退到最后匹配的坐标113       i=idx;114       //从root的开始匹配115       currentNode = root;116       //清空匹配到的词117       word = null;118       //清空当前路径匹配到的所有字119       sb = new StringBuilder();120      }121     }122     if(i==arr.length-2){123      if(word!=null && word.length()>0){124       Integer num = map.get(word);125       if(num==null){126        map.put(word, 1);127       }else{128        map.put(word, num+1);129       }130      }131     }132    }133 134    return map;135   }136  }137 138  public static void main(String[] args) {139   TrieTree tree = new TrieTree();140   tree.insert("北京");141   tree.insert("海淀区");142   tree.insert("中国");143   tree.insert("中国人民");144   tree.insert("中关村");145 146   String word = "中国";147   //查找该词是否存在 Trid Tree 中148   boolean flag = tree.search(word);149   if(flag){150    System.out.println("Trie Tree 中已经存在【"+word+"】");151   }else{152    System.out.println("Trie Tree 不包含【"+word+"】");153   }154 155   //分词156   Map<String, Integer> map = tree.tokenizer("中国人民,中国首都是北京,中关村在海淀区,中国北京天安门。中国人");157   for (Entry<String, Integer> entry : map.entrySet()) {158    System.out.println(entry.getKey()+":"+entry.getValue());159   }160 161  }162 }

View Code

四、HashMap 的实现原理?红黑树的结构?

1、从整体结构上......

原文转载:http://www.shaoqun.com/a/876496.html

跨境电商:https://www.ikjzd.com/

好卖家:https://www.ikjzd.com/w/776

焦点科技:https://www.ikjzd.com/w/1831

乐宝:https://www.ikjzd.com/w/2200


2021-常见问题收集整理-篇章1    一往情深深几许?深山夕照深秋雨。简介:2021-常见问题收集整理-篇章1,完善自身技能树,有备无患。一、顺序查找和二分查找法的时间复杂度分别为多少?二分查找VS顺序查找图1、顺序查找顺序查找的平均时间复杂度为O(logn),n是待查数列的长度,因为顺序查找是从头到尾查找,而且是查找了整个数组。当然最好的情况是数组的第1个元素就是我们要找的元素,这样可以直接
yiqu:https://www.ikjzd.com/w/210
灯塔计划:https://www.ikjzd.com/w/1281
去香港购物选购手机要注意什么?:http://www.30bags.com/a/404807.html
去香港国际机场DFS需要注意些什么?:http://www.30bags.com/a/404090.html
去香港还是去澳门买数码相机便宜?:http://www.30bags.com/a/403844.html
去香港黄大仙祠拜祭要注意些什么?:http://www.30bags.com/a/404353.html
闺蜜把我下面摸出水了 闺蜜用黄瓜折磨我过程:http://lady.shaoqun.com/m/a/248345.html
玩吧今天老师就是你的人 英语老师在宿舍满足了我:http://lady.shaoqun.com/m/a/248107.html
深圳有哪些好看的自然景观:http://www.30bags.com/a/501658.html
2021深圳求水山水上乐园开放了吗(服务时间):http://www.30bags.com/a/501659.html
男女都爱的八种姿势:http://lady.shaoqun.com/a/421139.html
女生包里有什么?公共场合14件私人好东西!你用过什么吗?:http://lady.shaoqun.com/a/421140.html

No comments:

Post a Comment