Map&Set1

一、Set和Map

1. Set

- 核心特点

- 无序性:元素存储顺序无规则 ,如 {1, 2, 3} 和 {3, 2, 1} 的Set是等价的,与有序的List不同。

- 不可修改性:不能直接修改元素,若要修改需删除旧元素插入新元素。

- 不重复性:不会保存重复元素。

- 接口与实现类: Set 是接口,常见实现类有 TreeSet (基于树形结构,通常是二叉搜索树相关 )和 HashSet (基于哈希表 ) 。

- 核心操作: add (添加元素)、 remove (删除元素)、 contains (判断元素是否存在)。主要应用场景是判断元素是否存在,如奖学金名单场景。

- 代码示例(Java)

 

import java.util.HashSet;

import java.util.Set;

import java.util.TreeSet;

 

public class SetExample {

    public static void main(String[] args) {

        // 使用TreeSet

        Set<String> set = new TreeSet<>();

        set.add("apple");

        set.add("banana");

        set.add("cherry");

        System.out.println("TreeSet: " + set);

 

        // 使用HashSet

        Set<String> set2 = new HashSet<>();

        set2.add("apple");

        set2.add("banana");

        set2.add("cherry");

        System.out.println("HashSet: " + set2);

 

        // 判断元素是否存在

        System.out.println("Contains apple in TreeSet: " + set.contains("apple"));

        System.out.println("Contains apple in HashSet: " + set2.contains("apple"));

 

        // 删除元素

        set.remove("banana");

        set2.remove("banana");

        System.out.println("TreeSet after remove: " + set);

        System.out.println("HashSet after remove: " + set2);

    }

}

 

2. Map

- 与Set的关系:类似于Set,但Set保存“键”,Map保存“键值对” 。

- 特点: key 唯一、无序且不可修改; value 无特殊要求。插入顺序不影响最终元素保存顺序,若 put 时 key 已存在则修改 value  。

- 相关概念

-  keySet :将所有 key 收集成一个Set。

-  entrySet :将所有 key - value 收集成一个Set, entry 表示条目 。

- 核心操作: get (根据 key 获取 value  )、 put (插入或修改键值对 )、 remove (根据 key 删除键值对 ) 。

- 代码示例(Java)

 

import java.util.HashMap;

import java.util.Map;

 

public class MapExample {

    public static void main(String[] args) {

        Map<String, String> map = new HashMap<>();

        map.put("及时雨", "宋江");

        map.put("黑旋风", "李逵");

        map.put("小李广", "花荣");

 

        System.out.println("Map: " + map);

 

        // 根据key获取value

        System.out.println("Get value by key '及时雨': " + map.get("及时雨"));

 

        // 修改value

        map.put("黑旋风", "李鬼");

        System.out.println("Map after modify: " + map);

 

        // 删除键值对

        map.remove("小李广");

        System.out.println("Map after remove: " + map);

 

        // 遍历keySet

        for (String key : map.keySet()) {

            System.out.println("Key: " + key);

        }

 

        // 遍历entrySet

        for (Map.Entry<String, String> entry : map.entrySet()) {

            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());

        }

    }

}

 

 

二、二叉搜索树

 

1. 定义与性质

- 是特殊二叉树,对任意节点,若左子树不为空,左子树所有 key 小于根节点 key ;若右子树不为空,右子树所有 key 大于等于根节点 key  。

- 查找类似二分方式,若根节点 key 等于查找 key  ,返回 true ;若根节点 key 大于查找 key  ,在左子树查找;若根节点 key 小于查找 key  ,在右子树查找 。

2. 时间复杂度:

最坏情况O(N)(树退化为链表状 ),理想情况(平衡二叉搜索树 )O(logN) 。

3. 节点删除操作

- 无左右子树:直接删除。

- 只有左子树:将左子树接到父节点对应位置。代码示例(Java) :

 

if (cur == parent.left) {

    parent.left = cur.left;

} else {

    parent.right = cur.left;

}

 

 

- 只有右子树:将右子树接到父节点对应位置。代码示例(Java) :

 

if (cur == parent.left) {

    parent.left = cur.right;

} else {

    parent.right = cur.right;

}

 

 

- 有左右子树:找到待删除节点右子树中最左侧元素(或左子树中最右侧元素 ),用其值替换待删除节点值,再删除该元素。

 

三、平衡二叉搜索树

 

1. 平衡条件:针对任意节点,左右子树高度差不超过1 ,避免单枝极端情况,提高查找效率 。

2. AVL树:严格平衡,查找快,但插入删除易打破平衡,调整频繁影响效率,实用性较差 。

3. 红黑树:平衡要求更均衡,通过系列规则定义,代码实现复杂,插入考虑多种情况,但实用价值高 。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值