![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法系列专题
文章平均质量分 67
程勇uestc
电子科大
展开
-
跳表(SkipList)的c++实现和性能测试
\quad跳表的理论参考这个PPT,本文主要介绍跳表的实现,以及跳表的性能随着概率因子变化而变化的情况,从而发现最优概率因子的范围。一、跳表的实现\quad跳表节点需要两个指针,一个指向右侧节点,一个指向下方节点,节点定义如下:struct Node{ int val; Node *next; // 右边节点 Node *down; // 下方节点 Node(int x){ val = x; next = down = NULL;原创 2022-02-28 16:25:57 · 1813 阅读 · 0 评论 -
int范围内数的约数个数最多为1536
int范围内数的约数个数最多为1536原创 2021-12-19 21:49:43 · 1185 阅读 · 1 评论 -
整数划分问题
\quad一个正整数n可以表示成若干个正整数之和,形如:n=n1+n2+…+nkn=n_1+n_2+…+n_kn=n1+n2+…+nk,其中n1≥n2≥…≥nk,k≥1n_1≥n_2≥…≥n_k,k≥1n1≥n2≥…≥nk,k≥1。我们将这样的一种表示称为正整数n的一种划分。现在给定一个正整数n,请你求出n共有多少种不同的划分方法。输入格式共一行,包含一个整数n。输出格式共一行,包含一个整数,表示总划分数量。由于答案可能很大,输出结果请对109+710^9+7109+7取模。数据范围原创 2020-11-03 15:57:26 · 967 阅读 · 0 评论 -
Identifying Infected
\quad对于每次查询(a,b),都去循环遍历图中每个点f,假设去掉这个点后a是否还能到b,如果去掉f后a不能到b,则f点一定被感染。这样的话时间复杂度为O(Q∗N∗(N+M))O(Q*N*(N+M))O(Q∗N∗(N+M)),可以过掉30%的数据。#include <iostream>#include <queue>#include <vector>using namespace std;const int N = 1010;vector<int&原创 2020-10-27 14:27:08 · 564 阅读 · 0 评论 -
c++实现split功能
vector<string> split(string s, char c=' '){ s += c; vector<string> ret; string t; for(int i = 0; i < s.length(); i ++ ) { if(s[i] == c) ret.push_back(t), t = ""; else t += s[i]; } retu原创 2020-10-23 14:53:34 · 1716 阅读 · 1 评论 -
数论——约数问题
一、一个数的约数个数有多少\quad取个例子,对于12而言,其约数有1,2,3,4,6,126个不同的约数。怎么快速的求出一个数的约数数目有多少个呢?可以对这个数进行质因子分解,分解成N=p1α1p2α2⋯pnαnN=p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_n^{\alpha_n}N=p1α1p2α2⋯pnαn,这样其约数个数为(α1+1)∗(α2+1)∗(αn+1)(\alpha_1+1)*(\alpha_2+1)*(\alpha_n+1)(α1+1)∗(原创 2020-10-22 19:16:49 · 849 阅读 · 0 评论 -
并查集模板
#include <bits/stdc++.h>using namespace std;const int maxn = 1e4+10;int father[maxn];int isRoot[maxn]; // 记录是否是根节点int find(int x){ while(x!=father[x]) x = father[x]; return x;}// 路径...原创 2019-07-27 11:37:21 · 1116 阅读 · 0 评论 -
Trie树模板
\quad这里实现一个通用的Trie树模板,支持单词插入,查询某个单词出现次数和打印输出所有以某个字符串为前缀的所有字符串这三个功能。程序如下:#include <iostream>#include <map>using namespace std;struct Node{ char c; int cnt; // 以该节点为结尾的单词数目 map<char, Node *> child; Node(char c) {原创 2020-10-21 10:33:36 · 610 阅读 · 0 评论 -
算法系列第三讲——位运算,离散化和区间合并
一、位运算取出n的二进制的第k位:n >> k & 1返回n的最后一位1:lowbit(n) = n & -n\quad根据上面的操作,我们就可以得到三种计算一个数n的二进制中1的个数:int cnt1(int n){ int ret = 0; for(int i = 0; i < 31; i ++ ) if(n >> i & 1 == 1) ret ++ ; return ret;}int c原创 2020-09-25 21:21:25 · 739 阅读 · 0 评论 -
算法系列第二讲——高精度,前缀和与差分
内容摘要高精度加减乘除一维和二维前缀和一维和二维差分一、高精度1、加法2、减法3、乘法除法二、前缀和三、差分\quad差分是前缀和的逆运算,已知数组a[],构造一个差分数组b[],使得a[]是b[]的前缀和,即a[i]=b[1]+b[2]+...+b[i]。给区间[l, r]中的每个数加上c等价于:b[l] += c, b[r + 1] -= c,运行若干次这样的运算后对b[]进行累加可以得到经过若干次加c操作后的a[]。...原创 2020-09-23 09:08:24 · 700 阅读 · 0 评论 -
算法系列第一讲——排序和二分
内容摘要快速排序归并排序整数二分浮点数二分一、排序1、快速排序输入一个未排序的数组q[],步骤如下:1.确定分界点x,x可以是q[l],q[r],q[(l+r)/2]2.调整区间,使得左边区间的数小于等于x,右边区间的数大于等于x。该过程可以用两个指针i,j分别指向区间开头和区间结尾,不断右移i直到找到第一个大于等于x的数的位置,不断左移j直到找到第一个小于等于x的位置,随后交换i,j对应的两个数3.递归处理左右两个区间2、归并排序输入一个未排序的数组q[],步骤如下:1原创 2020-09-22 16:04:37 · 619 阅读 · 0 评论