电子商务网站的运营一般需要做哪些准备,wordpress 多说 代码,在线购物网站建设的需求分析,网站开发核心技术目录
10.4 哈希优化策略
10.4.1 线性查找#xff1a;以时间换空间
10.4.2 哈希查找#xff1a;以空间换时间 10.4 哈希优化策略
在算法题中#xff0c;我们常通过将线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。
Question
给…目录
10.4 哈希优化策略
10.4.1 线性查找以时间换空间
10.4.2 哈希查找以空间换时间 10.4 哈希优化策略
在算法题中我们常通过将线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。
Question
给定一个整数数组 nums 和一个目标元素 target 请在数组中搜索“和”为 target 的两个元素并返回它们的数组索引。返回任意一个解即可。
10.4.1 线性查找以时间换空间
考虑直接遍历所有可能的组合。如图 10-9 所示我们开启一个两层循环在每轮中判断两个整数的和是否为 target 若是则返回它们的索引。 图 10-9 线性查找求解两数之和
代码如下所示
two_sum.c
/* 方法一暴力枚举 */
int *twoSumBruteForce(int *nums, int numsSize, int target, int *returnSize) {for (int i 0; i numsSize; i) {for (int j i 1; j numsSize; j) {if (nums[i] nums[j] target) {int *res malloc(sizeof(int) * 2);res[0] i, res[1] j;*returnSize 2;return res;}}}*returnSize 0;return NULL;
}此方法的时间复杂度为 (2) 空间复杂度为 (1) 在大数据量下非常耗时。
10.4.2 哈希查找以空间换时间
考虑借助一个哈希表键值对分别为数组元素和元素索引。循环遍历数组每轮执行图 10-10 所示的步骤。
判断数字 target - nums[i] 是否在哈希表中若是则直接返回这两个元素的索引。将键值对 nums[i] 和索引 i 添加进哈希表。
123 图 10-10 辅助哈希表求解两数之和
实现代码如下所示仅需单层循环即可
two_sum.c
/* 哈希表 */
typedef struct {int key;int val;UT_hash_handle hh; // 基于 uthash.h 实现
} HashTable;/* 哈希表查询 */
HashTable *find(HashTable *h, int key) {HashTable *tmp;HASH_FIND_INT(h, key, tmp);return tmp;
}/* 哈希表元素插入 */
void insert(HashTable *h, int key, int val) {HashTable *t find(h, key);if (t NULL) {HashTable *tmp malloc(sizeof(HashTable));tmp-key key, tmp-val val;HASH_ADD_INT(h, key, tmp);} else {t-val val;}
}/* 方法二辅助哈希表 */
int *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) {HashTable *hashtable NULL;for (int i 0; i numsSize; i) {HashTable *t find(hashtable, target - nums[i]);if (t ! NULL) {int *res malloc(sizeof(int) * 2);res[0] t-val, res[1] i;*returnSize 2;return res;}insert(hashtable, nums[i], i);}*returnSize 0;return NULL;
}此方法通过哈希查找将时间复杂度从 (2) 降至 () 大幅提升运行效率。
由于需要维护一个额外的哈希表因此空间复杂度为 () 。尽管如此该方法的整体时空效率更为均衡因此它是本题的最优解法。