From 00136b91f9dbb2bc78d3d866d95ed25b561668c8 Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Sun, 7 Nov 2021 00:16:03 +0800 Subject: [PATCH] update readme.md --- 6 Sort/README.md | 33 +++++++++++++++++-- 8 Algorithms Analysis/README.md | 12 +++---- 8 Algorithms Analysis/分治算法.md | 15 +++++---- 8 Algorithms Analysis/动态规划.md | 3 +- 8 Algorithms Analysis/递归.md | 2 +- .../mapreduce/Hash映射,分而治之.md | 20 +++++++++++ 6 files changed, 68 insertions(+), 17 deletions(-) create mode 100644 91 Algorithms In Big Data/mapreduce/Hash映射,分而治之.md diff --git a/6 Sort/README.md b/6 Sort/README.md index 9cfae22..0e4508a 100644 --- a/6 Sort/README.md +++ b/6 Sort/README.md @@ -149,7 +149,7 @@ void quicksort(int *a, int left, int right){ ### 归并排序merge -分治算法(divide-and-conquer),必然用到递归 ; +分治算法(divide-and-conquer),必然用到递归 ; 2个有序数组的合并操作是O(n)的复杂度 因此我们可以将无序的数组,分成2个子数组分别排序,然后再merge,依次类推 @@ -161,7 +161,7 @@ void quicksort(int *a, int left, int right){ 3. 合并 -归并排序的代码框架如下: +归并排序的代码框架,套用二叉树的后续遍历思路,如下: ``` void sort(int[] nums, int lo, int hi) { @@ -174,6 +174,35 @@ void sort(int[] nums, int lo, int hi) { merge(nums, lo, mid, hi); /************************/ } + +//合并连个有序数组; 从后往前merge +public void merge(int[] arr,int low,int mid,int high,int[] tmp){ + int i = 0; + int j = low,k = mid+1; //左边序列和右边序列起始索引 + + while(j <= mid && k <= high){ + if(arr[j] < arr[k]){ + tmp[i++] = arr[j++]; + }else{ + tmp[i++] = arr[k++]; + } + } + + //若左边序列还有剩余,则将其全部拷贝进tmp[]中 + while(j <= mid){ + tmp[i++] = arr[j++]; + } + + while(k <= high){ + tmp[i++] = arr[k++]; + } + + for(int t=0;t 自顶向下的递归,自底向上是迭代 diff --git a/91 Algorithms In Big Data/mapreduce/Hash映射,分而治之.md b/91 Algorithms In Big Data/mapreduce/Hash映射,分而治之.md new file mode 100644 index 0000000..a964710 --- /dev/null +++ b/91 Algorithms In Big Data/mapreduce/Hash映射,分而治之.md @@ -0,0 +1,20 @@ +# Hash映射,分而治之 + +这里的`Hash映射`是指通过一种映射散列的方式,将海量数据均匀分布在对应的内存或更小的文件中 + +使用hash映射有个最重要的特点是: `hash值相同的两个串不一定一样,但是两个一样的字符串hash值一定相等`。哈希函数如下: + +``` +int hash = 0; +for (int i=0;i