Ciyeblog - 算法
https://www.ciyekua.cn/index.php/category/算法
-
二分搜索函数 C/C++
https://www.ciyekua.cn/index.php/diary/157.html
2024-08-31T13:51:00+08:00
二分搜索函数
C语言:`bsearch()`
C++:`binary_search()`
1.C语言:bsearch()
函数原型如下:
```
void* bsearch(
const void *key,
const void *ptr,
size_t count,
size_t size,
int (*comp)(const void*, const void*) );
```
2.C++:binary_search()
```
binary_search(起始地址,结束地址,要查找的数值)
返回的是是否存在这么一个数,是一个bool值。
```
3.C++扩展
```
lower_bound(起始地址,结束地址,要查找的数值)
lower_bound():返回大于或等于目标值的第一个位置
upper_bound(起始地址,结束地址,要查找的数值)
upper_bound():返回大于目标值的第一个位置
```
```
参考资料:
https://blog.csdn.net/sinat_31608641/article/details/124975237
https://baijiahao.baidu.com/s?id=1793956676806508127&wfr=spider&for=pc
```
-
接触到的STL库函数统计
https://www.ciyekua.cn/index.php/diary/153.html
2024-08-15T18:35:00+08:00
1.nth_element() 2024/08/15
作用:找出数组中第k小的数
> https://www.ciyekua.cn/index.php/diary/152.html
-
利用stl中nth_element()找出第k小的数字
https://www.ciyekua.cn/index.php/diary/152.html
2024-08-15T18:28:00+08:00
找出一个数组中第k小的数
一、朴素做法
sort() 时间复杂度:O(nlogn)
二、利用STL库函数nth_element()
时间复杂度:O(n)
用法:`nth_element(a,a+k,a+n)`
长度为n的数组a[]中找出第k小的数
-
rand()(随机化算法)
https://www.ciyekua.cn/index.php/diary/148.html
2024-08-15T17:09:00+08:00
1.rand() 函数的基本用法
rand() 函数不需要参数,它会返回一个从 0 到最大随机数之间的任意整数。
最大随机数的大小通常是固定的一个大整数,例如 RAND_MAX。
***注意:***在windows操作系统下最大为2^15-1(即32767),LINUX坏境下最大为2^31-1
如要生成更大范围随机数需要`rand()*rand()`或`(rand()
-
RMQ算法(计算机求区间最值算法)
https://www.ciyekua.cn/index.php/diary/138.html
2024-08-14T23:30:00+08:00
一、求区间最大值的各种方法及时间复杂度
1、朴素(即搜索),O(n)-O(qn) online。
2、线段树,O(n)-O(qlogn) online。
3、ST(实质是动态规划),O(nlogn)-O(q) online。
ST算法(Sparse Table),以求最大值为例,设d[i,j]表示[i,i+2^j-1]这个区间内的最大值,那么在询问到[a,b]区间的最大值时答案就是max(d[a,k], d[b-2^k+1,k]),其中k是满足2^k<=b-a+1(即长度)的最大的k,即k=[ln(b-a+1)/ln(2)]。
d的求法可以用动态规划,d[i, j]=max(d[i, j-1],d[i+2^(j-1), j-1])。
4、RMQ标准算法:先规约成LCA(Lowest Common Ancestor),再规约成约束RMQ,O(n)-O(q) online。
首先根据原数列,建立笛卡尔树,从而将问题在线性时间内规约为LCA问题。LCA问题可以在线性时间内规约为约束RMQ,也就是数列中任意两个相邻的数的差都是+1或-1的RMQ问题。约束RMQ有O(n)-O(1)的在线解法,故整个算法的时间复杂度为O(n)-O(1)。
RMQ算法时间复杂度:
***时间复杂度为O(nlogn),然后可以在O(1)的时间内处理每次查询。***
二、RMQ模板题
> https://ac.nowcoder.com/acm/contest/88527/H
ac代码:`https://ac.nowcoder.com/acm/contest/view-submission?submissionId=70974305`
三、RMQ模板
```
int n,a[1000005];
int dp[100005][25];
void rmq_init(){
for(int i = 1; i
-
gcd和lcm
https://www.ciyekua.cn/index.php/diary/136.html
2024-08-05T23:10:00+08:00
gcd:最大公约数
lcm:最小公倍数
**2个数a,b的gcd、lcm:**
GCD2=__gcd(a,b)
LCM2=a*b/GCD
**3个数a,b,c的gcd、lcm:**
GCD3=__gcd(GCD2,c)
LCM3=LCM2*c/GCD3
代码实现:
```
#include
using namespace std;
// 求最大公约数
int GCD(int a, int b) {
if (b == 0) {
return a;
} else {
return GCD(b, a % b);
}
}
// 求最小公倍数
int LCM(int a, int b) {
return a * b / GCD(a, b);
}
int main() {
int a, b, c;
cout a >> b >> c;
int gcd = GCD(GCD(a, b), c);
int lcm = LCM(LCM(a, b), c);
cout
-
接触到的算法统计
https://www.ciyekua.cn/index.php/diary/134.html
2024-08-04T21:39:00+08:00
1.滑动窗口 2024/07/23
cf961 b1 `https://codeforces.com/contest/1995/problem/B1`
(据说也可用贪心做?但不知道怎么做...)
2.gcd、lcm 2024/08/05
`https://www.ciyekua.cn/index.php/diary/136.html`
3.RMQ(求区间最大值) 2024/08/14
时间复杂度为O(nlogn),然后可以在O(1)的时间内处理每次查询。
`https://ac.nowcoder.com/acm/contest/88527/H`
4.质数筛 2024/08/14
(待补充...)
5.rand()随机化算法 2024/08/15
`https://www.ciyekua.cn/index.php/diary/148.html`
-
滑动窗口摘要
https://www.ciyekua.cn/index.php/diary/133.html
2024-05-10T17:36:00+08:00
一、滑动窗口是什么
滑动窗口是双指针算法的一种,基本思路为维护一个窗口,然后从前往后遍历元素进行运算。
二、滑动窗口算法和其他双指针算法的区别
双指针算法常见的为三种:
1.快慢指针算法(常用于链表有环判断)
2.双向指针(两个指针一个从最左,一个从最右出发进行查找),典型应用为二分查找
3.滑动窗口(两个指针一前一后出发,两个指针中间维持一个窗口结构
[点击查看原文][1]
[1]: https://blog.csdn.net/qq_54850598/article/details/127863026