![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
分治法
rlycomeon
没有天赋,但仍然坚持!
展开
-
快速排序
前言:对于快速排序的原理网上或书本上很清楚,在此就不再累赘了。对代码有疑问的朋友欢迎留言。一定回复(及时)对于代码中STL中一些函数的用法,请自行百度或谷歌。此代码效仿左程云大佬的。在此表示感谢!#include<iostream>#include<algorithm>#include<time.h>#include<cstring>#def...原创 2018-03-22 19:39:21 · 111 阅读 · 0 评论 -
大数相乘(分治法)
前言:A,B两个大数,都为n位,要计算A*B,需要将A和B划分成两等份,如下图所示普通的做法是A*B=a1*b1*10^n+(a1*b0+b1*a0)*10^(2/n)+a0*b0举个例子:1234*9876=(12*98)*10000+(12*76+98*34)*100+34*76对于这个算法的时间复杂度,我们需要做4次n/2级别的乘法和3加法。即T(n)=4*T(n/2)+O(n),时间复杂度...原创 2018-03-29 18:54:54 · 5842 阅读 · 5 评论 -
荷兰国旗问题
前言: 问题网上已经很清楚了,和快排一样的partition。下面直接上代码。对代码有疑问的朋友,欢迎留言。#include<iostream>#include<algorithm>using namespace std;void swap(int arr[], int i, int j) { int tem; tem = arr[i]; arr[i] = ar...原创 2018-03-23 21:33:00 · 131 阅读 · 0 评论 -
线性时间选择(TOP K)
问题描述:找出一个数组中第K小的元素,时间复杂度为O(n)。解法:1.首先大家都会想到的解法是排序,之后找出第k个元素,但是排序的时间复杂度不符合要求,或者需要额外的空间。2.利用快排的思想,以枢纽(随机得到)为界,将数组分为2部分,一部分小于等于这个枢纽值,一部分大于这个枢纽值,与快排不同的是,我们只处理一部分,另一部分舍弃。代码如下:#include<iostream> #in...原创 2018-03-25 15:37:00 · 2812 阅读 · 0 评论 -
求X^Y
利用分治法求X^Y注意:Y的奇偶#include<iostream>using namespace std;float fast_pow(float x, float y) { if (y == 1) { return x; } else { if ((int)y%2 == 0) { return fast_pow(x, y / 2)*fast_pow(x, ...原创 2018-03-21 21:14:54 · 309 阅读 · 0 评论 -
棋盘覆盖问题
问题描述在一个2^k×2^k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 ...原创 2018-03-22 11:49:38 · 283 阅读 · 0 评论 -
2分查找和3分查找
前言:本文当中的2分查找和3分查找的数组都是有序的。一.3分查找将数组分为3部分,1/3处和2/3处。思想和2分查找的思想一样。代码如下:#include<iostream>#include<string>using namespace std;int F(int arr[], int l, int r, int m) { int mid1 = (r - l) / ...原创 2018-03-26 21:01:42 · 836 阅读 · 0 评论 -
线性时间选择(Top K)
直接上代码:#include<iostream>using namespace std;const int maxn = 10000;int kp[maxn], mid[maxn];void InsertionSort(int kp[], int n) { for (int j, i = 1; i < n; i++) { int tmp = kp[i]; for...原创 2018-04-09 23:34:07 · 598 阅读 · 0 评论