- 拓扑排序,三面是迪杰斯特拉
- morris遍历二叉树
- 二叉搜索树与给定值相差最小的节点
- 相同连续01的个数
- 字节-合并k个链表,
- 字节-拓扑排序的问题
- 二叉堆topk问题 数组原地右移k个位置二面问了一个把栈里元素排序问题
- 荷兰国旗问题
- []int{1,3,6,7,9,10} 元素有奇偶数,把奇数去掉,空间复杂度最小。
- 现在有个登录日志,记录用户登录退出功能,请用一个算法实现任意时间段同时在线人数
- 算法题,二叉树,不能取相邻节点,怎么取最大值
- 二叉树非递归前序遍历
- 二叉树两个节点的公共路径
- 找到右边的数和左边的数的最大差值
- 连续数组的最大和
- 二叉搜索树第k大的节点
- 大文件排序
- 文件切分
- 快排
- 堆排序
- 一个随机数生成器只有0和1 生成概率为p和1-p,要写一个随机数生成器,生成1和0的概率都为1/2
- 写程序反转链表
- 限流算法
- 算法 将k个长度为n的有序数组排序
- 二叉搜索树顺序输出
- 二叉树镜像
输入:
4
/
2 7
/ \ /
1 3 6 9
输出:
4
/
7 2
/ \ /
9 6 3 1
func invertTree(root *TreeNode) *TreeNode {
if root == nil {
return nil
}
root.Left, root.Right = root.Right, root.Left
invertTree(root.Left)
invertTree(root.Right)
return root
}
哈希(Hash),也称散列,是将任意长度的消息压缩成固定长度的消息摘要的函数。哈希函数将输入数据(也称为消息或明文)转换成固定长度的输出值(也称为哈希值、消息摘要、数字指纹),并且具有以下特性:
相同的输入数据总是会生成相同的哈希值;
不同的输入数据生成的哈希值是不同的;
无法从哈希值中推出原始的输入数据;
即使输入数据只有微小的变化,其生成的哈希值也会有很大的不同。
哈希函数广泛应用于信息安全领域,例如数字签名、消息认证、密码学等方面。在计算机科学中,哈希函数也被用于数据结构的设计和优化,例如哈希表、布隆过滤器等。哈希函数的设计需要考虑到哈希冲突、哈希性能、哈希安全性等因素,以确保其具有高效性、安全性和可靠性。
哈希冲突指的是不同的数据在计算哈希值时产生了相同的哈希值,这可能会影响哈希表的性能和正确性。以下是几种常见的解决哈希冲突的方法:
链接法(Chaining):在哈希表中,每个桶都指向一个链表,哈希值相同的数据会被放到同一个桶中的链表里。这种方法可以通过增加桶的数量来减少冲突的概率。
开放地址法(Open Addressing):在哈希表中,哈希值相同的数据被放置到另一个可用的桶中,而不是使用链表。开放地址法有几种不同的变体,包括线性探测、二次探测和双重哈希等。
建立一个完美哈希函数:如果知道数据的范围,可以构建一个完美哈希函数,使得每个数据都映射到不同的哈希值,从而避免哈希冲突。但这需要预处理,并且在新数据到来时需要重新构建哈希表。
拉链再散列(Cuckoo Hashing):它通过将每个键哈希到两个不同的位置,如果冲突发生,将冲突键移动到它的另一个哈希位置,或者用冲突键占据其它冲突位置的键来避免冲突。
在实际应用中,不同的哈希表实现可能采用不同的方法来解决哈希冲突。选择哪种方法取决于实际应用的需求和数据特征