一文搞定哈希表!万字图文详解!请带着耐心点进来!
文章目录
- 哈希表的原理
- 哈希表的原理
- 示例
- 设计哈希表的关键
- 1. 哈希函数
- 2. 冲突解决
- 设计哈希集合
- 单独链表法
- 设计哈希映射
- Java静态数组+单链表
- 复杂度分析 - 哈希表
- 复杂度分析
- 内置哈希表的原理
- 哈希集 - 用法
- 使用哈希集查重
- 示例
- 模板
- 哈希映射 - 用法
- 场景 I - 提供更多信息
- 示例
- 更重要的是
- 模板
- 场景 II - 按键聚合
- 示例
- 更重要的是
- 模板
- 设计键
- 示例
- 解决方案
- 设计键 - 总结
- 解决方案
- 设计键 - 总结
哈希表的原理
正如我们在介绍中提到的,哈希表
是一种数据结构,它使用哈希函数组织数据,以支持快速插入和搜索
。在本文中,我们将简要说明哈希表的原理。
哈希表的原理
哈希表的关键思想是使用哈希函数将键映射到存储桶
。更确切地说,
- 当我们插入一个新的键时,哈希函数将决定该键应该分配到哪个桶中,并将该键存储在相应的桶中;
- 当我们想要搜索一个键时,哈希表将使用相同的哈希函数来查找对应的桶,并只在特定的桶中进行搜索。
示例
在示例中,我们使用 y = x % 5
作为哈希函数。让我们使用这个例子来完成插入和搜索策略:
- 插入:我们通过哈希函数解析键,将它们映射到相应的桶中。
- 例如,1987 分配给桶 2,而 24 分配给桶 4。
- 搜索:我们通过相同的哈希函数解析键,并仅在特定存储桶中搜索。
- 如果我们搜索 1987,我们将使用相同的哈希函数将1987 映射到 2。因此我们在桶 2 中搜索,我们在那个桶中成功找到了 1987。
- 例如,如果我们搜索 23,将映射 23 到 3,并在桶 3 中搜索。我们发现 23 不在桶 3 中,这意味着 23 不在哈希表中。
设计哈希表的关键
在设计哈希表时,你应该注意两个基本因素。
1. 哈希函数
哈希函数是哈希表中最重要的组件,该哈希表用于将键映射到特定的桶。在上面的示例中,我们使用 y = x % 5
作为散列函数,其中 x
是键值,y
是分配的桶的索引。
散列函数将取决于键值的范围
和桶的数量。
下面是一些哈希函数的示例:
哈希函数的设计是一个开放的问题。其思想是尽可能将键分配到桶中,理想情况下,完美的哈希函数将是键和桶之间的一对一映射。然而,在大多数情况下,哈希函数并不完美,它需要在桶的数量和桶的容量之间进行权衡。
2. 冲突解决
理想情况下,如果我们的哈希函数是完美的一对一映射,我们将不需要处理冲突。不幸的是,在大多数情况下,冲突几乎是不可避免的。例如,在我们之前的哈希函数(y = x % 5)中,1987 和 2 都分配给了桶 2,这是一个冲突
。
冲突解决算法应该解决以下几个问题:
- 如何组织在同一个桶中的值?
- 如果为同一个桶分配了太多的值,该怎么办?
- 如何在特定的桶中搜索目标值?
根据我们的哈希函数,这些问题与桶的容量
和可能映射到同一个桶
的键的数目
有关。
让我们假设存储最大键数的桶有 N
个键。
通常,如果 N 是常数且很小,我们可以简单地使用一个数组将键存储在同一个桶中。如果 N 是可变的或很大,我们可能需要使用高度平衡的二叉树
来代替.。
设计哈希集合
单独链表法
哈希函数的共同特点是使用模运算符。。其中,base 将决定 HashSet 中的桶数。
从理论上讲,桶越多(因此空间会越大)越不太可能发生碰撞。base 的选择是空间和碰撞之间的权衡。
此外,使用质数作为base 是一个明智的选择。例如 769,可以减少潜在的碰撞。
对于桶的设计,我们有几种选择,可以使用数组来存储桶的所有值。然而数组的一个缺点是需要O(N) 的时间复杂度进行插入和删除,而不是O(1)。
因为任何的更新操作,我们首先是需要扫描整个桶为了避免重复。选择链表来存储桶的所有值是更好的选择,插入和删除具有常数的时间复杂度。
算法:
正如我们在上面讨论的,这里将采用 LinkedList
实现 HashSet 中的桶。
对于每个功能 add
,remove
,contains
,我们首先生成桶的散列值,操作相对应的桶。
class MyHashSet {private int bucket = 769;private Node[] array;/** Initialize your data structure here. */public MyHashSet() {this.array = new Node[bucket];}public void add(int key) {int index = hash(key);if(array[index] == null){array[index] = new Node();}array[index].add(key);}private int hash(int key){return key % bucket;}public void remove(int key) {int index = hash(key);if(array[index] != null){array[index].remove(key);}}/** Returns true if this set contains the specified element */public boolean contains(int key) {int index = hash(key);if(array[index] != null){return array[index].contains(key);}return false;}class Node{private LinkedList<Integer> linkedList;public Node(){this.linkedList = new LinkedList();;}private void add(int key){if(!linkedList.contains(key)){linkedList.add(key);}}//注意这边需要传入一个Integer,这是因为LinkedList有两个方法 remove(int) 是根据下标删除//remove(Integer) 是删除指定的元素private void remove(Integer key){linkedList.remove(key);}private boolean contains(int key){return linkedList.contains(key);}}
}/*** Your MyHashSet object will be instantiated and called as such:* MyHashSet obj = new MyHashSet();* obj.add(key);* obj.remove(key);* boolean param_3 = obj.contains(key);*/
设计哈希映射
Java静态数组+单链表
考虑到本题目所设计的哈希表存储的键值对都是正整数,完全可以只使用Java的静态数组实现,但是实测时间和空间效率都不是很高。在静态数组的基础上添加单链表可以在较高的效率下实现,并且最终代码量并不大。
实现原理:
图中显示了存储[1=1, 2=5, 10001=1]三个键值对的哈希表,hash函数计算的哈希值作为数组的索引,数组中存储链表的虚拟头节点,当出现哈希冲突时,在链表后挂接新的节点。这样在操作哈希表时只需要判断对应hash地址是否为null,如果是null则创建虚拟头和链表头,如果已经有虚拟头则进行链表操作。使用虚拟头节点可以很方便地简化对链表的增删改操作。
- hash函数:
int hash = key % N;
N为静态数组的长度,本程序设为10000 - 底层数组:
Node[] data = new Node[N];
- 链表节点:每个节点中存储一个键值对,操作时保证需要键唯一
private class Node {int key;//key唯一int value;Node next;Node(int key, int value) {this.key = key;this.value = value;}}
-
代码:
-
class MyHashMap {private final int N = 10000;//静态数组长度10000private Node[] data;/*** Initialize your data structure here.*/public MyHashMap() {data = new Node[N];}/*** value will always be non-negative.*/public void put(int key, int value) {int hash = hash(key);if (data[hash] == null) {//该hash地址没有链表节点data[hash] = new Node(-1, -1);//先存虚拟头data[hash].next = new Node(key, value);//再存实际头节点} else {Node prev = data[hash];//从虚拟头开始遍历while (prev.next != null) {if (prev.next.key == key) {prev.next.value = value;//有键,更新值return;}prev = prev.next;}prev.next = new Node(key, value);//没有键,添加节点}}/*** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key*/public int get(int key) {int hash = hash(key);if (data[hash] != null) {Node cur = data[hash].next;//从实际头节点开始寻找while (cur != null) {if (cur.key == key) {return cur.value;//找到}cur = cur.next;}}return -1;//没有找到}/*** Removes the mapping of the specified value key if this map contains a mapping for the key*/public void remove(int key) {int hash = hash(key);if (data[hash] != null) {Node prev = data[hash];while (prev.next != null) {//删除节点if (prev.next.key == key) {Node delNode = prev.next;prev.next = delNode.next;delNode.next = null;return;}prev = prev.next;}}}//哈希函数private int hash(int key) {return key % N;}//链表节点private class Node {int key;//key唯一int value;Node next;Node(int key, int value) {this.key = key;this.value = value;}}}
复杂度分析 - 哈希表
复杂度分析
如果总共有 M
个键,那么在使用哈希表时,可以很容易地达到 O(M)
的空间复杂度。
但是,你可能已经注意到哈希表的时间复杂度与设计有很强的关系。
我们中的大多数人可能已经在每个桶中使用数组
来将值存储在同一个桶中,理想情况下,桶的大小足够小时,可以看作是一个常数
。插入和搜索的时间复杂度都是 O(1)
。
但在最坏的情况下,桶大小的最大值将为 N
。插入时时间复杂度为 O(1)
,搜索时为 O(N)
。
内置哈希表的原理
内置哈希表的典型设计是:
- 键值可以是任何
可哈希化的
类型。并且属于可哈希类型的值将具有哈希码
。此哈希码将用于映射函数以获取存储区索引。 - 每个桶包含一个
数组
,用于在初始时将所有值存储在同一个桶中。 - 如果在同一个桶中有太多的值,这些值将被保留在一个
高度平衡的二叉树搜索树
中。
插入和搜索的平均时间复杂度仍为 O(1)。最坏情况下插入和搜索的时间复杂度是 O(logN)
,使用高度平衡的 BST。这是在插入和搜索之间的一种权衡。
哈希集 - 用法
哈希集
是集合的实现之一,它是一种存储不重复值
的数据结构。
我们提供了在 Java,C++ 和 Python 中使用哈希集的示例。 如果你不熟悉哈希集的用法,那么通过这一示例将会很有帮助。
java
// "static void main" must be defined in a public class.
public class Main {public static void main(String[] args) {// 1. initialize the hash setSet<Integer> hashSet = new HashSet<>(); // 2. add a new keyhashSet.add(3);hashSet.add(2);hashSet.add(1);// 3. remove the keyhashSet.remove(2); // 4. check if the key is in the hash setif (!hashSet.contains(2)) {System.out.println("Key 2 is not in the hash set.");}// 5. get the size of the hash setSystem.out.println("The size of has set is: " + hashSet.size()); // 6. iterate the hash setfor (Integer i : hashSet) {System.out.print(i + " ");}System.out.println("are in the hash set.");// 7. clear the hash sethashSet.clear();// 8. check if the hash set is emptyif (hashSet.isEmpty()) {System.out.println("hash set is empty now!");}}
}
c++
#include <unordered_set> // 0. include the libraryint main() {// 1. initialize a hash setunordered_set<int> hashset; // 2. insert a new keyhashset.insert(3);hashset.insert(2);hashset.insert(1);// 3. delete a keyhashset.erase(2);// 4. check if the key is in the hash setif (hashset.count(2) <= 0) {cout << "Key 2 is not in the hash set." << endl;}// 5. get the size of the hash setcout << "The size of hash set is: " << hashset.size() << endl; // 6. iterate the hash setfor (auto it = hashset.begin(); it != hashset.end(); ++it) {cout << (*it) << " ";}cout << "are in the hash set." << endl;// 7. clear the hash sethashset.clear();// 8. check if the hash set is emptyif (hashset.empty()) {cout << "hash set is empty now!" << endl;}
}
python
# 1. initialize the hash set
hashset = set()
# 2. add a new key
hashset.add(3)
hashset.add(2)
hashset.add(1)
# 3. remove a key
hashset.remove(2)
# 4. check if the key is in the hash set
if (2 not in hashset):print("Key 2 is not in the hash set.")
# 5. get the size of the hash set
print("Size of hashset is:", len(hashset))
# 6. iterate the hash set
for x in hashset:print(x, end=" ")
print("are in the hash set.")
# 7. clear the hash set
hashset.clear()
print("Size of hashset:", len(hashset))
使用哈希集查重
我们知道,插入新值并检查值是否在哈希集中是简单有效的。
因此,通常,使用哈希集来检查该值是否已经出现过。
示例
让我们来看一个例子:
给定一个整数数组,查找数组是否包含任何重复项。
这是一个典型的问题,可以通过哈希集来解决。
你可以简单地迭代每个值并将值插入集合中。 如果值已经在哈希集中,则存在重复。
模板
在这里,我们为你提供了解决此类问题的模板:
/** Template for using hash set to find duplicates.*/
boolean findDuplicates(List<Type>& keys) {// Replace Type with actual type of your keySet<Type> hashset = new HashSet<>();for (Type key : keys) {if (hashset.contains(key)) {return true;}hashset.add(key);}return false;
}
哈希映射 - 用法
哈希映射
是用于存储 (key, value)
键值对的一种实现。
我们提供了一个在 Java、C++ 和 Python 中使用哈希映射的示例。如果您还不熟悉哈希映射的用法,那么浏览一下这个示例将很有帮助。
c++
#include <unordered_map> // 0. include the libraryint main() {// 1. initialize a hash mapunordered_map<int, int> hashmap;// 2. insert a new (key, value) pairhashmap.insert(make_pair(0, 0));hashmap.insert(make_pair(2, 3));// 3. insert a new (key, value) pair or update the value of existed keyhashmap[1] = 1;hashmap[1] = 2;// 4. get the value of a specific keycout << "The value of key 1 is: " << hashmap[1] << endl;// 5. delete a keyhashmap.erase(2);// 6. check if a key is in the hash mapif (hashmap.count(2) <= 0) {cout << "Key 2 is not in the hash map." << endl;}// 7. get the size of the hash mapcout << "the size of hash map is: " << hashmap.size() << endl; // 8. iterate the hash mapfor (auto it = hashmap.begin(); it != hashmap.end(); ++it) {cout << "(" << it->first << "," << it->second << ") ";}cout << "are in the hash map." << endl;// 9. clear the hash maphashmap.clear();// 10. check if the hash map is emptyif (hashmap.empty()) {cout << "hash map is empty now!" << endl;}
}
java
// "static void main" must be defined in a public class.
public class Main {public static void main(String[] args) {// 1. initialize a hash mapMap<Integer, Integer> hashmap = new HashMap<>();// 2. insert a new (key, value) pairhashmap.putIfAbsent(0, 0);hashmap.putIfAbsent(2, 3);// 3. insert a new (key, value) pair or update the value of existed keyhashmap.put(1, 1);hashmap.put(1, 2);// 4. get the value of specific keySystem.out.println("The value of key 1 is: " + hashmap.get(1));// 5. delete a keyhashmap.remove(2);// 6. check if a key is in the hash mapif (!hashmap.containsKey(2)) {System.out.println("Key 2 is not in the hash map.");}// 7. get the size of the hash mapSystem.out.println("The size of hash map is: " + hashmap.size()); // 8. iterate the hash mapfor (Map.Entry<Integer, Integer> entry : hashmap.entrySet()) {System.out.print("(" + entry.getKey() + "," + entry.getValue() + ") ");}System.out.println("are in the hash map.");// 9. clear the hash maphashmap.clear();// 10. check if the hash map is emptyif (hashmap.isEmpty()) {System.out.println("hash map is empty now!");}}
}
python
# 1. initialize a hash map
hashmap = {0 : 0, 2 : 3}
# 2. insert a new (key, value) pair or update the value of existed key
hashmap[1] = 1
hashmap[1] = 2
# 3. get the value of a key
print("The value of key 1 is: " + str(hashmap[1]))
# 4. delete a key
del hashmap[2]
# 5. check if a key is in the hash map
if 2 not in hashmap:print("Key 2 is not in the hash map.")
# 6. both key and value can have different type in a hash map
hashmap["pi"] = 3.1415
# 7. get the size of the hash map
print("The size of hash map is: " + str(len(hashmap)))
# 8. iterate the hash map
for key in hashmap:print("(" + str(key) + "," + str(hashmap[key]) + ")", end=" ")
print("are in the hash map.")
# 9. get all keys in hash map
print(hashmap.keys())
# 10. clear the hash map
hashmap.clear();
print("The size of hash map is: " + str(len(hashmap)))
场景 I - 提供更多信息
使用哈希映射的第一个场景是,我们需要更多的信息
,而不仅仅是键。然后通过哈希映射建立密钥与信息之间的映射关系
。
示例
让我们来看一个例子:
给定一个整数数组,返回两个数字的索引,使它们相加得到特定目标。
在这个例子中,如果我们只想在有解决方案时返回 true,我们可以使用哈希集合来存储迭代数组时的所有值,并检查 target - current_value
是否在哈希集合中。
但是,我们被要求返回更多信息
,这意味着我们不仅关心值,还关心索引。我们不仅需要存储数字作为键,还需要存储索引作为值。因此,我们应该使用哈希映射而不是哈希集合。
更重要的是
在某些情况下,我们需要更多信息,不仅要返回更多信息,还要帮助我们做出决策
。
在前面的示例中,当我们遇到重复的键时,我们将立即返回相应的信息。但有时,我们可能想先检查键的值是否可以接受。
模板
在这里,我们为您提供了解决此类问题的模板:
/** Template for using hash map to find duplicates.* Replace ReturnType with the actual type of your return value.*/
ReturnType aggregateByKey_hashmap(List<Type>& keys) {// Replace Type and InfoType with actual type of your key and valueMap<Type, InfoType> hashmap = new HashMap<>();for (Type key : keys) {if (hashmap.containsKey(key)) {if (hashmap.get(key) satisfies the requirement) {return needed_information;}}// Value can be any information you needed (e.g. index)hashmap.put(key, value); }return needed_information;
}
场景 II - 按键聚合
另一个常见的场景是按键聚合所有信息
。我们也可以使用哈希映射来实现这一目标。
示例
这是一个例子:
给定一个字符串,找到它中的第一个非重复字符并返回它的索引。如果它不存在,则返回 -1。
解决此问题的一种简单方法是首先计算每个字符的出现次数
。然后通过结果找出第一个与众不同的角色。
因此,我们可以维护一个哈希映射,其键是字符,而值是相应字符的计数器。每次迭代一个字符时,我们只需将相应的值加 1。
更重要的是
解决此类问题的关键是在遇到现有键时确定策略
。
在上面的示例中,我们的策略是计算事件的数量。有时,我们可能会将所有值加起来。有时,我们可能会用最新的值替换原始值。策略取决于问题,实践将帮助您做出正确的决定。
模板
在这里,我们为您提供了解决此类问题的模板:
/** Template for using hash map to find duplicates.* Replace ReturnType with the actual type of your return value.*/
ReturnType aggregateByKey_hashmap(List<Type>& keys) {// Replace Type and InfoType with actual type of your key and valueMap<Type, InfoType> hashmap = new HashMap<>();for (Type key : keys) {if (hashmap.containsKey(key)) {hashmap.put(key, updated_information);}// Value can be any information you needed (e.g. index)hashmap.put(key, value); }return needed_information;
}
设计键
在以前的问题中,键的选择相对简单。不幸的是,有时你必须考虑在使用哈希表时设计合适的键
。
示例
我们来看一个例子:
给定一组字符串,将字母异位词组合在一起。
众所周知,哈希映射可以很好地按键分组信息。但是我们不能直接使用原始字符串作为键。我们必须设计一个合适的键来呈现字母异位词的类型。例如,有字符串 “eat” 和 “ate” 应该在同一组中。但是 “eat” 和 “act” 不应该组合在一起。
解决方案
实际上,设计关键
是在原始信息和哈希映射使用的实际键之间建立映射关系
。设计键时,需要保证:
属于同一组的所有值都将映射到同一组中。
需要分成不同组的值不会映射到同一组。
此过程类似于设计哈希函数,但这是一个本质区别。哈希函数满足第一个规则但可能不满足第二个规则
。但是你的映射函数应该满足它们。
在上面的示例中,我们的映射策略可以是:对字符串进行排序并使用排序后的字符串作为键。也就是说,“eat” 和 “ate” 都将映射到 “aet”。
有时,设计映射策略可能是非常棘手的
。
设计键 - 总结
这里有一些为你准备的关于如何设计键的建议。
- 当字符串 / 数组中每个元素的顺序不重要时,可以使用
排序后的字符串 / 数组
作为键。 - 如果只关心每个值的偏移量,通常是第一个值的偏移量,则可以使用
偏移量
作为键。 - 在树中,你有时可能会希望直接使用
TreeNode
作为键。 但在大多数情况下,采用子树的序列化表述
可能是一个更好的主意。 - 在矩阵中,你可能希望使用
行索引
或列索引
作为键。 - 在数独中,可以将行索引和列索引组合来标识此元素属于哪个
块
。
组中。但是 “eat” 和 “act” 不应该组合在一起。
解决方案
实际上,设计关键
是在原始信息和哈希映射使用的实际键之间建立映射关系
。设计键时,需要保证:
属于同一组的所有值都将映射到同一组中。
需要分成不同组的值不会映射到同一组。
此过程类似于设计哈希函数,但这是一个本质区别。哈希函数满足第一个规则但可能不满足第二个规则
。但是你的映射函数应该满足它们。
在上面的示例中,我们的映射策略可以是:对字符串进行排序并使用排序后的字符串作为键。也就是说,“eat” 和 “ate” 都将映射到 “aet”。
有时,设计映射策略可能是非常棘手的
。
设计键 - 总结
这里有一些为你准备的关于如何设计键的建议。
- 当字符串 / 数组中每个元素的顺序不重要时,可以使用
排序后的字符串 / 数组
作为键。[外链图片转存中…(img-GAs5TqnJ-1595519356020)] - 如果只关心每个值的偏移量,通常是第一个值的偏移量,则可以使用
偏移量
作为键。[外链图片转存中…(img-JHnqU729-1595519356020)] - 在树中,你有时可能会希望直接使用
TreeNode
作为键。 但在大多数情况下,采用子树的序列化表述
可能是一个更好的主意。[外链图片转存中…(img-jjmFZI1v-1595519356021)] - 在矩阵中,你可能希望使用
行索引
或列索引
作为键。 - 在数独中,可以将行索引和列索引组合来标识此元素属于哪个
块
。[外链图片转存中…(img-inj282uq-1595519356021)] - 有时,在矩阵中,您可能希望将值聚合在
同一对角线
中。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- Python第二章条件 循环
Python第二章-条件 循环if条件while循环for循环range()函数enumerate()函数break关键字continue关键字pass关键字assert关键字推导式 本笔记旨在复习时能快速唤醒记忆,适用人群非纯小白,谢谢! 临时该换门楣,上一章链接:Python第一章-初识Python . if条件判断体部分可以是布…...
2024/4/22 5:20:56 - 原生 JavaScript 中 window.onload 全局加载模块中定义的函数 不能执行的一些问题
一个关于在window.onload里面定义函数,然后在html里面调用函数时出现错误。具体见下面 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, i…...
2024/5/4 23:52:51 - 算法 - 动态规划
题目给定两个数组,如下:low = [2, 3, 1, 7], high = [4, 6, 5, 8], 数组长度一样第i次只能从low[i] 和 hight[i] 里面取一个数。如果从low[i] 取,则第i+1次依然可以从low[i]取;如果第i次从hight[i]取,则第i+1次只能从low[i+1]中取,请给出一个选择方案,使得最终选择方案…...
2024/5/7 4:04:15 - 简单实用 | 用Gitbook做笔记 / 写书过程全记录
用Gitbook写随笔1. 准备2. 开始写书2.1 创建书籍2.2 撰写书籍2.2.1 生成目录2.2.2 写你所想2.3 构建书籍2.4 预览书籍2.5 生成书籍3 发布书籍4 配置和插件在寻找合适的电子笔记方式过程中,看到了用 gitbook 做笔记,有很多优点,不过也比较麻烦,最终还是选择了用 OneNote 做笔…...
2024/5/7 8:36:17 - 最最常用的26条Linus命令整理
最最常用的25条Linus命令整理 文件和目录 1.cd /home 进目录 2.cd .. 回上一级目录 3.cd -回上一次所在目录 4.pwd 显示工作路径 5.ls 查看目录中的文件 6.ls -F 查看目录中的文件 7.ls -1显示文件和目录的详细资料 8.ls -a显示隐藏文件 9.mkdir dir1创建一个叫做‘dir1’的目录…...
2024/4/18 22:48:48 - LeetCode解析------241.为运算表达式设计优先级-分治算法
题目: 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。 示例 1:输入: “2-1-1” 输出: [0, 2] 解释: ((2-1)-1) = 0 (2-(1-1)) = 2示例 2:输入: “23-45” 输出:…...
2024/5/7 7:12:44 - 决策树实现iris数据分类
#加载数据 import pandas as pd import numpy as np data = pd.read_csv(iris_data.csv) data.head()#定义X,y X = data.drop([target,label],axis=1) y = data.loc[:,label] print(X.shape,y.shape)#打印X,y的维度(150, 4) (150,)#建立决策树模型 from sklearn import tree d…...
2024/4/17 15:49:45 - ActivityMQ高级篇
下载地址 https://www.rurucode.com/14796.html 第一节(课前回顾).mp4 第二节(ActivityMQ设置持久化机制).mp4 第三节(JMS可靠消息).mp4 第四节(SpringBoot整合ActivityMQ).mp4 第五节(使用ActivityMQ注意事项).mp4 第六节(解决消息中间件幂等).mp4 第七节(消费者集群).mp4 Act…...
2024/4/8 21:51:43 - 第三天打卡
第三天打卡 文本表示方法 onehot编码 把字转变为稀疏的编码 Bags of Words 把每个文档中的字用其出现次数来表示 sklearn中可以用CountVectorizer来实现 from sklearn.feature_extraction.text import CountVectorizer corpus = [This is the first document.,This document is…...
2024/5/5 20:32:36 - 数据分离与混淆矩阵 好坏质检分类
好坏质检分类实战task:基于data_class_raw.csv数据,根据高斯分布概率密度函数,寻找异常点并剔除基于data_class_processed.csv数据,进行PCA处理,确定重要数据维度及成分 完成数据分离,数据分离参数:random_state=4,test_size=0.4 建立KNN模型完成分类,n_neighbors取10,…...
2024/4/16 19:06:17 - JAVA中注解的实现原理
JAVA中注解的实现原理...
2024/4/9 2:14:27 - Vue组件
在src中components中,新建组件(首字母建议大写)举例我的写入template,script style标签 在app.vue中引用组件 js中先引入// 第一步引入组件import Header from ‘./components/Header.vue’// 第二步:在export default注册组件 components: { Header } 第三步使用组件 …...
2024/4/14 3:52:43 - 用scss写一个数组及遍历
// 定义数组,数组元素用逗号隔开 $liColor:#f5ad1b,#5f89ce,#94bf45,#da8ec5,#78bfc2,#bec278;// 开始 @each 循环遍历数组 // $c 作为循环变量,代表了数组的元素,不是索引~!!! @each $c in $liColor{$i:index($liColor,$c); // 获取 $c 在数组中的索引,并赋值给…...
2024/4/21 19:28:34 - ssm项目-用户管理系统(一)
ssm项目-用户管理系统(一)ssm项目与普通的java项目有很多不同。引入了很多的配置文件,前段后端的分离,项目的分层等等。 下面介绍ssm项目的大致运行过程。以Maven项目为例,首先这个web项目需要服务器,对于中小型项目tomcat就能完成 tomcat的配置启动项目后会根据自带的in…...
2024/4/9 2:14:24 - Java并发系列(5)ReentrantLock源码分析
Java并发系列(5)ReentrantLock源码分析...
2024/4/13 0:59:22 - 2-4 类型转换
在C语言中的数据类型是可以相互转换--强制类型转换-(Type)var_name;- (Type)vaule;目标类型能够容纳目标值:结果不变 目标类型不能够容纳目标值:结果产生截断(不是所有都能强制转换成功)--隐式类型转换编译器主动进行的类型转换,低类型到高类型的隐式类型转换是安全…...
2024/4/9 2:14:23 - python基础练习2
条件语句和循环语句思维导图难点提炼练习以及解答 思维导图难点提炼 if not x:和if x is not None:和if not x is None 练习以及解答1.编写一个Python程序来查找那些可以被7除以5的整数的数字,介于1500和2700之间。2、龟兔赛跑游戏 题目描述: 话说这个世界上有各种各样的兔子和…...
2024/4/16 12:40:15 - Group Sample:一个简单有效的目标检测升点Trick
1. 前言 今天为大家介绍一个CVPR 2019提出的一个有趣的用于人脸检测的算法,这个算法也可以推广到通用目标检测中,它和OHEM,Focal Loss有异曲同工之妙。论文地址为:http://openaccess.thecvf.com/content_CVPR_2019/papers/Ming_Group_Sampling_for_Scale_Invariant_Face_De…...
2024/4/9 2:14:20 - 让程序跳转到某绝对地址执行——程序计数器PC
已知:函数int a=2;的地址是0x08000734; int b=4;的地址是0x08000736; int c=6;的地址是0x08000738。 第一步:手动改变R15(PC程序计数器)的值为0x08000736,函数的执行语句会跳到int b=4所在的211行。第二步:手动改变R15(PC程序计数器)的值为0x08000738,函数的执行语句…...
2024/4/25 10:22:07 - 条件与循环
assert 关键词 assert这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssertionError的异常while - else 循环 当while循环正常执行完的情况下,执行else输出,如果while循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内…...
2024/4/21 16:02:38
最新文章
- React 第二十三章 shouldComponentUpdate
React 中的 shouldComponentUpdate 是一个生命周期方法,用于控制组件是否需要重新渲染。 文档地址:https://zh-hans.reactjs.org/docs/react-component.html#shouldcomponentupdate shouldComponentUpdate 接收两个参数:nextProps 和 nextS…...
2024/5/7 10:35:10 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/6 9:38:23 - 线程池的方式爬虫
<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version> </dependency><!-- 爬虫需…...
2024/5/6 22:03:03 - CTK插件框架学习-事件监听(04)
CTK插件框架学习-插件注册调用(03)https://mp.csdn.net/mp_blog/creation/editor/136989802 一、主要流程 发送者注册消息事件接收者订阅消息事件接收者相应消息事件 事件监听比插件接口调用耦合性更弱,事件由框架维护,不需要指定发送方和接收方 二、…...
2024/5/6 8:34:00 - [蓝桥杯 2014 省 A] 波动数列
容我菜菲说一句,全网前排题解都是rubbish,当然洛谷某些也是litter 不好意思,最近背单词背了很多垃圾的英文,正题开始 [蓝桥杯 2014 省 A] 波动数列 题目描述 输入格式 输入的第一行包含四个整数 n , s , a , b n,s,a,b n,s,a…...
2024/5/5 14:22:54 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/5/6 18:23:10 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/5/6 18:40:38 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/5/6 23:37:19 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/6 7:24:07 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/5/7 0:32:52 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/5/6 6:01:13 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/6 7:24:06 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/5/7 1:54:46 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/6 20:04:22 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/5/7 0:32:51 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/5/6 7:24:04 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/6 7:24:04 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/5/6 19:38:16 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/5/6 7:24:03 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/7 0:32:49 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/6 21:25:34 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/5/6 7:24:02 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/7 7:26:29 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/7 0:32:47 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/5/6 16:50:57 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57