set和map不同底层实现的区别
[python]list, tuple, dictionary, set的底层细节
https://blog.csdn.net/siyue0211/article/details/80560783
Python中dict的实现细节
CPython使用伪随机探测(pseudo-random probing)的散列表(hash table)作为字典的底层数据结构。由于这个实现细节,只有可哈希的对象才能作为字典的键。
Python中所有不可变的内置类型都是可哈希的。可变类型(如列表,字典和集合)就是不可哈希的,因此不能作为字典的键。
字典的三个基本操作(添加元素,获取元素和删除元素)的平均事件复杂度为O(1),但是他们的平摊最坏情况复杂度要高得多,为O(N).
操作 平均复杂度 平摊最坏情况复杂度 获取元素 O(1) O(n) 修改元素 O(1) O(n) 删除元素 O(1) O(n) 复制 O(n) O(n) 遍历 O(n) O(n) 还有一点很重要,在复制和遍历字典的操作中,最坏的复杂度中的n是字典曾经达到的最大元素数目,而不是当前的元素数目。换句话说,如果一个字典曾经元素个数很多,后来又大大减小了,那么遍历这个字典可能会花费相当长的事件。因此在某些情况下,如果需要频繁的遍历某个词典,那么最好创建一个新的字典对象,而不是仅在旧字典中删除元素。
Python中set的实现
练习题
Leetcode242 Valid Anagram
https://leetcode.com/problems/valid-anagram/
判断字符串t是否是字符串s变换字符顺序后得到的结果
Example 1:
1 | Input: s = "anagram", t = "nagaram" |
Example 2:
1 | Input: s = "rat", t = "car" |
解题:
创建两个dict分别记录s和t的字符和该字符出现的频率,再比较两个记录的dict是否相等。
1 | class Solution: |
Leetcode202 Happy Number
https://leetcode.com/problems/happy-number/
一个数将其替换为其各位数字的平方和,重复这个过程,如果最终能得到1,这是happy number,如果这个过程陷入了一个不包含1的循环,则不是happy number
Example:
1 | Input: 19 |
解题:
用set()记录每次操作的num,如果该num没有在set中出现,则才能进行循环操作;
1 | def happyNumber(num): |
Leetcode290 Word Pattern
https://leetcode.com/problems/word-pattern/
给出一个模式(pattern)以及一个字符串,判断这个字符串是否符合模式?
Example 1:
1 | Input: pattern = "abba", str = "dog cat cat dog" |
Example 2:
1 | Input:pattern = "abba", str = "dog cat cat fish" |
Example 3:
1 | Input: pattern = "aaaa", str = "dog cat cat dog" |
Example 4:
1 | Input: pattern = "abba", str = "dog dog dog dog" |
注意:字符集? 空串符合任意模式?还是不符合任意模式?
解题
1 | def wordPattern(pattern, word_str): |