ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Map和Set (搜索树)

2022-09-10 21:32:04  阅读:238  来源: 互联网

标签:Map Set cur val Nodest 搜索 Key public


1.搜索

1.1概念

Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关.常见的搜索方式有两种

1直接遍历,时间复杂度为O(N),元素多时相对效率低, 2二分查找,时间复杂度为O(logN),搜索的前提必须是有序数列
 

1.2模型

1  纯Key模型  如 查找字典中的字母, Set模型只存储Key

2  Key--value模型  如 查找字典中某字母出现的次数     Map中存储 Key--value

 

2 Map的使用

2.1Map的使用

Map是一个接口类,没有继承Collection,该类储存的是<Key,Value>键值对,这里的Key一定是唯一的,不能重复,否则会覆盖

2.2Map.Entry<k,v>的使用

Map.Entry<k,v>是Map内部实现用来存放<k,v>键值映射关系的内部类,

 

 

2.3Map的常用方法

 

 boolen containsValue(Object Key)                                                 判断是否包含Value                 

注意:

1. Map是个接口不能直接实例化对象,如果实例化对象只能实例其实现类TreeMap或者HashMap

2. Map中存放的key是唯一的,value可以重复

3. Map插入时key不能为空会报异常,value可以为空

4. Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。

5. Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。

6. Map中的值不能直接修改,value可以修改,如果修改key需要先删除,在添加

 

3Set的使用

Set继承了Collection接口类,只储存了Key

 

 

注意:

1.Set最大的功能就是对集合中的元素进行去重

2.实现Set接口的常用类有TreeSet和HashSet

3. Set中的Key和Map中的一样都要先删除在添加

 

(以下为日常代码)

  public List<String> topKFrequent(String[] words, int k) {
        HashMap<String,Integer> map=new HashMap<>();
        //1统计出现的次数
        for (String s:words) {
            if (map.get(s)==null){
                map.put(s,1);
            }else {
                int val=map.get(s);
                map.put(s,val+1);
            }
        }
        //2建立一个小根堆
        PriorityQueue<Map.Entry<String,Integer>> Minmap=new PriorityQueue<>(k, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                //判断前K次 如果频率相同时,字母的顺序排列
                if (o1.getValue().compareTo(o2.getValue())==0){
                    return o1.getKey().compareTo(o2.getKey());
                }
                return o1.getValue()-o2.getValue();
            }
        });
        //3遍历MAP
        for (Map.Entry<String,Integer> entry: map.entrySet()) {
            if (Minmap.size()<k){
                Minmap.offer(entry);
            }else {
                Map.Entry<String,Integer> top=Minmap.peek();
                //判断频率是否相同如果相同,比较单词小的,单词小的入堆
                if (top.getValue().compareTo(entry.getValue())==0){
                    if (top.getKey().compareTo(entry.getKey())>0){
                        Minmap.poll();
                        Minmap.offer(entry);
                    }else {
                        if (top.getValue().compareTo(entry.getValue())<0){
                            Minmap.poll();
                            Minmap.offer(entry);
                        }
                }

                }
            }
        }
        System.out.println(Minmap);
        List<String> list=new ArrayList<>();
        for (int i = 0; i <k ; i++) {
            Map.Entry<String,Integer> top =Minmap.poll();
            list.add(top.getKey());
        }
        Collections.reverse(list);
        return list;

 

 
 public Node copyRandomList(Node head) {
        Map<Node,Node> str=new  HashMap<>();
        Node cur=head;
        while (cur!=null){
            Node val=new Node(cur.val);
            str.put(cur,val);
            cur=cur.next;
        }
        cur=head;
        while (cur!=null){
            str.get(cur).next=str.get(cur.next);
            str.get(cur).random=str.get(cur.random);
            cur=cur.next;
        }
        return cur;

 

 

 

4 搜索树

若它的左子树不为空,则左子树上所有节点的值都小于根节点的值

若它的右子树不为空,则右子树上所有节点的值都大于根节点的值

它的左右子树也分别为二叉搜索树

 

class Nodest{
    public int val;
    public Nodest left;
    public Nodest right;

    public Nodest(int val){
        this.val=val;
    }
}
public class BinnarySearchTree {
    public Nodest root=null;

    //查找val是否在二叉搜索树内
    public Nodest search(int key){
       Nodest cur=root;
       while (cur!=null){
           if (cur.val>key){
               cur=cur.left;
           }else if (cur.val<key){
               cur=cur.right;
           }else {
               return cur;
           }
       }
       return null;
    }

    //插入新val
    public boolean insort(int val){
        if (root==null){
            root=new Nodest(val);
            return true;
        }
        Nodest parent=root;
        Nodest cur=root;
        while (cur!=null){
            if (cur.val>val){
                parent=cur;
                cur=cur.left;
            }else if (cur.val<val){
                parent=cur;
                cur=cur.right;
            }else {
                return false;
            }
        }
        if (parent.val>val){
            parent.left=new Nodest(val);

        }else if (parent.val<val){
            parent.right=new Nodest(val);

        }
        return true;
    }

    //删除操作
    public  void delete(int key){
        Nodest cur=root;
        Nodest parent=null;
        while (cur!=null){
            if (cur.val ==key){
                remove(cur,parent);
                break;
            }else if (cur.val<key){
                parent=cur;
                cur=cur.right;
            }else {
                parent=cur;
                cur=cur.left;
            }
        }
    }

    public void remove(Nodest cur,Nodest parent){
        if (cur.left==null){
            if (cur==root){
                root=cur.right;
            }else if (cur==parent.left){
                cur.right=parent.left;
            }else {
                parent.right=cur.right;
            }
        }else if (cur.right==null){
            if (cur==root){
                root=cur.right;
            }else if (cur==parent.left){
                cur.left=parent.left;
            }else {
                parent.right=cur.left;
            }
        }else {
          Nodest tap=cur;
          Nodest ta=cur.right;
          while (ta.left!=null){
              tap=ta;
              ta=ta.left;
          }
          cur.val=ta.val;
          if (ta==tap.left){
              tap.left=ta.right;
          }else {
              tap.right=ta.right;
          }

        }
    }
}

 

标签:Map,Set,cur,val,Nodest,搜索,Key,public
来源: https://www.cnblogs.com/lbwboke/p/16678395.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有