diff --git "a/2023\345\271\264\344\270\255\351\227\262\350\201\212/index.html" "b/2023\345\271\264\344\270\255\351\227\262\350\201\212/index.html" index cbfd5aa..9d26ffb 100644 --- "a/2023\345\271\264\344\270\255\351\227\262\350\201\212/index.html" +++ "b/2023\345\271\264\344\270\255\351\227\262\350\201\212/index.html" @@ -116,11 +116,11 @@

目录

- + Older
- 算法基础课1-3(杂乱) + 基础算法
diff --git a/HelloWorld/1.png b/HelloWorld/1.png deleted file mode 100644 index 5b3b1de..0000000 Binary files a/HelloWorld/1.png and /dev/null differ diff --git a/HelloWorld/HelloWorldBanner.jpg b/HelloWorld/HelloWorldBanner.jpg deleted file mode 100644 index b38b576..0000000 Binary files a/HelloWorld/HelloWorldBanner.jpg and /dev/null differ diff --git a/HelloWorld/index.html b/HelloWorld/index.html index 65fae61..577cadb 100644 --- a/HelloWorld/index.html +++ b/HelloWorld/index.html @@ -89,7 +89,7 @@

目录

把原来的一些杂乱的学习笔记都删了

因为我觉得博客应该是记录一些自己的想法而不是生抄别人的博客或者代码

-

logo.png

+

logo.png

测试一下图片

public class Main{
     public static void init(){
@@ -111,11 +111,11 @@ 

目录

-

其中null=0x3f3f3f3fnull = 0x3f3f3f3f

-

字符串哈希

-

将字符串看成P进制数P的经验值是131或13331取这两个值的冲突概率低
+

其中$null = 0x3f3f3f3f$

+

字符串哈希

+

将字符串看成P进制数P的经验值是131或13331取这两个值的冲突概率低
小技巧取模的数用2^64这样直接用unsigned long long存储溢出的结果就是取模的结果

typedef unsigned long long ULL;
 ULL h[N], p[N]; // h[k]存储字符串前k个字母的哈希值, p[k]存储 P^k mod 2^64
@@ -513,7 +512,7 @@ 

{ return h[r] - h[l - 1] * p[r - l + 1]; }

-

C++ STL

+

C++ STL

vector, 变长数组倍增的思想
     size()  返回元素个数
     empty()  返回是否为空
diff --git a/algorithm-dp/index.html b/algorithm-dp/index.html
index fa61483..f9007d8 100644
--- a/algorithm-dp/index.html
+++ b/algorithm-dp/index.html
@@ -82,14 +82,14 @@ 

目录

-
  1. 1. 动态规划
  2. 2. 线性DP
  3. 3. 区间DP
  4. 4. 计数类DP
  5. 5. 数位统计DP
  6. 6. 状态压缩DP
  7. 7. 树形DP
  8. 8. 记忆化搜索
  9. 9. 杂题
+
  1. 1. 动态规划
  2. 2. 线性DP
  3. 3. 区间DP
  4. 4. 计数类DP
  5. 5. 数位统计DP
  6. 6. 状态压缩DP
  7. 7. 树形DP
  8. 8. 记忆化搜索
  9. 9. 杂题
-

动态规划

+

动态规划

    -
  • 状态表示f[i,j]f[i,j] +
  • 状态表示$f[i,j]$
    • 集合
    • 属性MaxMinCnt
    • @@ -101,45 +101,45 @@

-

线性DP

+

线性DP

数字三角形

-

O(n2)O(n^2)

-

f[i,j]f[i,j]表示到坐标为[i,j][i,j]的路径的和最大值

-

f[1][1]=a[1][1]f[1][1] = a[1][1]

-

f[i][j]=max(f[i1][j1]+a[i][j],f[i1][j]+a[i][j])f[i][j] = max(f[i-1][j-1]+a[i][j], f[i-1][j]+a[i][j])

+

$O(n^2)$

+

$f[i,j]$表示到坐标为$[i,j]$的路径的和最大值

+

$f[1][1] = a[1][1]$

+

$f[i][j] = max(f[i-1][j-1]+a[i][j], f[i-1][j]+a[i][j])$

最长上升子序列

-

朴素O(n2)O(n^2)

-

f[i]f[i]表示以第ii个数结尾的序列中上升子序列长度的最大值

-

遍历aia_i所有可能的前一个数aja_j(aj<aia_j<a_i0ji10 \le j \le i-1)

-

f[i]=max(f[j]+1,f[i]),j[0,i1]f[i] = max(f[j]+1,f[i]),j \in [0,i-1]

-

如果要保存最长序列g[i]g[i]保存从哪一步jj转移过来

+

朴素$O(n^2)$

+

$f[i]$表示以第$i$个数结尾的序列中上升子序列长度的最大值

+

遍历$a_i$所有可能的前一个数$a_j$($a_j<a_i$$0 \le j \le i-1$)

+

$f[i] = max(f[j]+1,f[i]),j \in [0,i-1]$

+

如果要保存最长序列$g[i]$保存从哪一步$j$转移过来

代码https://www.luogu.com.cn/record/124595657

-

优化O(nlogn)O(nlogn)

+

优化$O(nlogn)$

用一个q数组储存长度为i的序列的结尾数字的最小值

-

可以证明qi>qi1>...>q2>q1q_i>q_{i-1}>...>q_2>q_1即数组严格单调递增

-

对于aia_i二分找到最大的qk<=aiq_k<=a_if[i]=k+1f[i] = k+1更新qk=aiq_k = a_i

+

可以证明$q_i>q_{i-1}>...>q_2>q_1$即数组严格单调递增

+

对于$a_i$二分找到最大的$q_k<=a_i$$f[i] = k+1$更新$q_k = a_i$

代码https://www.luogu.com.cn/record/133704642

最长公共子序列

-

朴素O(n2)O(n^2)

-

f[i][j]f[i][j]表示所有在第一个序列的前i个字母中出现且在第二个序列的前j个字母中出现的子序列的最大值

-

集合划分依据是否选择a[i],b[j]a[i],b[j]

-

分为四个集合选择a[i],b[j]a[i],b[j] ; 选择a[i]a[i] 不选择b[j]b[j] ; 不选择a[j]a[j]选择b[j]b[j] ; 都不选择a[i],b[j]a[i],b[j]

-

分别表示为 f[i1][j1],f[i,j1],f[i1][j],f[i1][j1]+1f[i-1][j-1] , f[i,j-1] , f[i-1][j] , f[i-1][j-1]+1

+

朴素$O(n^2)$

+

$f[i][j]$表示所有在第一个序列的前i个字母中出现且在第二个序列的前j个字母中出现的子序列的最大值

+

集合划分依据是否选择$a[i],b[j]$

+

分为四个集合选择$a[i],b[j]$ ; 选择$a[i]$ 不选择$b[j]$ ; 不选择$a[j]$选择$b[j]$ ; 都不选择$a[i],b[j]$

+

分别表示为 $f[i-1][j-1] , f[i,j-1] , f[i-1][j] , f[i-1][j-1]+1$

其中第二三种情况包含上面对应的集合由于是求Max所以有重复不影响结果

且第二三种集合也包含第一个集合所以只要对后三种集合求最大值即可

-

f[i,j]=max(f[i1,j],f[i,j1])f[i,j] = max(f[i-1,j],f[i,j-1])

-

a[i]==b[j]a[i]==b[j]时,f[i,j]=max(f[i,j],f[i1,j1]+1)f[i,j] = max(f[i,j],f[i-1,j-1]+1)

-

优化O(nlogn)O(nlogn)

+

$f[i,j] = max(f[i-1,j],f[i,j-1])$

+

$a[i]==b[j]$时,$f[i,j] = max(f[i,j],f[i-1,j-1]+1)$

+

优化$O(nlogn)$

编辑距离

-

f[i,j]f[i,j]所有将a[1i]a[1-i]变成b[1j]b[1-j]的操作方式的最小步数

+

$f[i,j]$所有将$a[1-i]$变成$b[1-j]$的操作方式的最小步数

区间划分①删除最后一个数②增加最后一个数③修改最后一个数

-

f[i1,j]+1f[i-1,j]+1

-

f[i,j1]+1f[i,j-1]+1

-

f[i1,j1]+1f[i-1,j-1]+1 如果a[i]==b[j]a[i]==b[j]则不需要加一即不需要进行修改操作

-

区间DP

+

$f[i-1,j]+1$

+

$f[i,j-1]+1$

+

$f[i-1,j-1]+1$ 如果$a[i]==b[j]$则不需要加一即不需要进行修改操作

+

区间DP

石子合并

-

f[i,j]f[i,j]表示将第ii堆石子到第jj堆石子合并成一堆石子的方式的代价最小值/最大值

-

O(n3)O(n^3)

+

$f[i,j]$表示将第$i$堆石子到第$j$堆石子合并成一堆石子的方式的代价最小值/最大值

+

$O(n^3)$

for(int len=2;len<=n;len++){
     for(int i=1;i+len-1<=n;i++){
         int l = i,r = i+len-1;
@@ -150,41 +150,41 @@ 

区间DP} } }

-

计数类DP

-

数位统计DP

+

计数类DP

+

数位统计DP

计数问题

-

n=abcdefgn=abcdefg枚举第ii位是 x[0,9]x \in [0,9]

-

举例x=1,i=4x=1,i=4的情况

-

设数字为xxx1yyyxxx1yyy

+

$n=abcdefg$枚举第$i$位是 $x \in [0,9]$

+

举例$x=1,i=4$的情况

+

设数字为$xxx1yyy$

    -
  • abc>xxx,xxx[000,abc1],y[000,999]abc>xxx,xxx \in [000,abc-1], y \in [000,999]则共有abc1000abc * 1000
  • -
  • abc<xxxabc<xxx则共有0个
  • -
  • abc=xxxabc=xxx +
  • $abc>xxx,xxx \in [000,abc-1], y \in [000,999]$则共有$abc * 1000$
  • +
  • $abc<xxx$则共有0个
  • +
  • $abc=xxx$
      -
    • d<1d<1无解
    • -
    • d=1d=1yyy[000,efg]yyy \in [000,efg],则有efg+1efg+1
    • -
    • d>1d>1yyy[000,999]yyy \in [000,999],有1000种
    • +
    • $d<1$无解
    • +
    • $d=1$$yyy \in [000,efg]$,则有$efg+1$
    • +
    • $d>1$$yyy \in [000,999]$,有1000种
-

当x=0时注意前导0即对于第一种情况xxx[001,abc1]xxx \in [001,abc-1]即有(abc1)1000(abc-1)*1000情况

+

当x=0时注意前导0即对于第一种情况$xxx \in [001,abc-1]$即有$(abc-1)*1000$情况

圆形数字

-

状态压缩DP

+

状态压缩DP

蒙德里安的梦想

-

f[i][j]f[i][j]表示第i列上一列横着摆的数量j,其中j是一个二进制数

+

$f[i][j]$表示第i列上一列横着摆的数量j,其中j是一个二进制数

最短Hamilton路径

-

f[i][j]f[i][j]表示从0号点走到j号点走过的所有点是i的所有路径(二进制数i表示某个点是否已经走过了)的最小路径长度

-

树形DP

+

$f[i][j]$表示从0号点走到j号点走过的所有点是i的所有路径(二进制数i表示某个点是否已经走过了)的最小路径长度

+

树形DP

没有上司的舞会

-

f[u][0]f[u][0]表示所有以u为根的子树中选择并且不选u这个点的方案的最大值

-

f[u][1]f[u][1]表示所有以u为根的子树中选择并且选u这个点的方案的最大值

-

设点u的子节点s1,s2,s3....sis_1,s_2,s_3....s_i

-

f[u][0]=1imax(f[si][0],f[si][1])f[u][0] = \sum_{1}^{i}max(f[s_i][0],f[s_i][1])

-

f[u][1]=1if[si][0]f[u][1] = \sum_{1}^{i}f[s_i][0]

+

$f[u][0]$表示所有以u为根的子树中选择并且不选u这个点的方案的最大值

+

$f[u][1]$表示所有以u为根的子树中选择并且选u这个点的方案的最大值

+

设点u的子节点$s_1,s_2,s_3....s_i$

+

$f[u][0] = \sum_{1}^{i}max(f[s_i][0],f[s_i][1])$

+

$f[u][1] = \sum_{1}^{i}f[s_i][0]$

找出根节点递归求最大值即可

-

记忆化搜索

+

记忆化搜索

滑雪

-

s[i][j]s[i][j]表示从(i,j)点出发能走的最长距离

+

$s[i][j]$表示从(i,j)点出发能走的最长距离

每次搜索一次记忆一次即可

举例

3 3 
@@ -197,15 +197,15 @@ 

然后找(2,1)的最长距离为2((2,1)->(1,1))

然后是(2,2)的最长距离如果没有记忆化那么搜索过程为(2,2)->(2,1)->(1,1)

但是2,1之前已经搜过了再去搜就是浪费时间之前搜索已经知道(2,1)的值为2那么搜索过程就是缩短为(2,2)->(2,1),即为3

-

杂题

+

杂题

动态规划1动态规划的引入

kkksc03考前临时抱佛脚

NOIP1999挖地雷

dp+递归倒序输出当然这题使用爆搜也可以过

最大字段和

-

f[i]f[i]表示ii所在的有效序列的最大字段和

-

如果f[i1]+a[i]f[i-1]+a[i]更大则加入到前一个有效序列

-

否则a[i]a[i]自己为一个有效序列

+

$f[i]$表示$i$所在的有效序列的最大字段和

+

如果$f[i-1]+a[i]$更大则加入到前一个有效序列

+

否则$a[i]$自己为一个有效序列

五倍经验日

01背包的变形

diff --git a/algorithm-greedy/index.html b/algorithm-greedy/index.html index 3340643..762b666 100644 --- a/algorithm-greedy/index.html +++ b/algorithm-greedy/index.html @@ -97,23 +97,23 @@

目录

否则ed为当前区间的右端点答案加一

区间分组

将区间按照左端点进行从小到大排序

-

遍历每个区间判断能否将其放在某个现有的组中判断l[i]<maxrl[i]<max_r是否成立

+

遍历每个区间判断能否将其放在某个现有的组中判断$l[i]<max_r$是否成立

如果不存在这样的组则开一个新祖将其放进去

-

如果存在这样的组将其放进去更新当前组的maxrmax_r

+

如果存在这样的组将其放进去更新当前组的$max_r$

区间覆盖

先将所有区间按左端点排序枚举每个区间第一次选择能覆盖s点的区间中右端点最大的区间将s更新为右端点的最大值

合并果子

选择值最小的两堆果子进行合并即可可以用优先队列求解记得把两者之和加回队列

排队打水

-

n 个人在一个水龙头前排队接水假如每个人接水的时间为TiT_i请编程找出这 n 个人排队的一种顺序使得 n 个人的平均等待时间最小

+

n 个人在一个水龙头前排队接水假如每个人接水的时间为$T_i$请编程找出这 n 个人排队的一种顺序使得 n 个人的平均等待时间最小

-

T=t1(n1)+t2(n2)+...+tn22+tn11T=t_1*(n-1)+t_2*(n-2)+...+t_{n-2}*2+t_{n-1}*1

+

$T=t_1*(n-1)+t_2*(n-2)+...+t_{n-2}*2+t_{n-1}*1$

所以尽可能将小的t放在前面与较大的系数相乘即按照从小到大排队总时间最小

货仓地址

奶牛耍杂技

Acwing中修改题干为求最大压扁值的可能最小值不影响求解思路及结果

-

按照wi+siw_i+s_i排序依次遍历求出压扁值的最大值输出答案即可

+

按照$w_i+s_i$排序依次遍历求出压扁值的最大值输出答案即可

diff --git a/algorithm-high-precision/index.html b/algorithm-high-precision/index.html deleted file mode 100644 index 008abda..0000000 --- a/algorithm-high-precision/index.html +++ /dev/null @@ -1,299 +0,0 @@ - - - - - - - 高精度算法 | HawYiorのBlog - - - - - - - - - - - - - - - - - - -
-
- - - -
-
- -
- - -
- - -

- 高精度算法 -

- - -
- - -
-

目录

- -
- -
- -

JavaJava中使用BigIntegerBigIntegerBigDecimalBigDecimal类实现

-

C++C++模版

-
    -
  • 高精度加法
  • -
-
// C = A + B, A >= 0, B >= 0
-vector<int> add(vector<int> &A, vector<int> &B)
-{
-    if (A.size() < B.size()) return add(B, A);
-
-    vector<int> C;
-    int t = 0;
-    for (int i = 0; i < A.size(); i ++ )
-    {
-        t += A[i];
-        if (i < B.size()) t += B[i];
-        C.push_back(t % 10);
-        t /= 10;
-    }
-
-    if (t) C.push_back(t);
-    return C;
-}
-
    -
  • 高精度减法
  • -
-
// C = A - B, 满足A >= B, A >= 0, B >= 0
-vector<int> sub(vector<int> &A, vector<int> &B)
-{
-    vector<int> C;
-    for (int i = 0, t = 0; i < A.size(); i ++ )
-    {
-        t = A[i] - t;
-        if (i < B.size()) t -= B[i];
-        C.push_back((t + 10) % 10);
-        if (t < 0) t = 1;
-        else t = 0;
-    }
-
-    while (C.size() > 1 && C.back() == 0) C.pop_back();
-    return C;
-}
-
    -
  • 高精度乘低精度
  • -
-
// C = A * b, A >= 0, b >= 0
-vector<int> mul(vector<int> &A, int b)
-{
-    vector<int> C;
-
-    int t = 0;
-    for (int i = 0; i < A.size() || t; i ++ )
-    {
-        if (i < A.size()) t += A[i] * b;
-        C.push_back(t % 10);
-        t /= 10;
-    }
-
-    while (C.size() > 1 && C.back() == 0) C.pop_back();
-
-    return C;
-}
-
    -
  • 高精度除以低精度
  • -
-
// A / b = C ... r, A >= 0, b > 0
-vector<int> div(vector<int> &A, int b, int &r)
-{
-    vector<int> C;
-    r = 0;
-    for (int i = A.size() - 1; i >= 0; i -- )
-    {
-        r = r * 10 + A[i];
-        C.push_back(r / b);
-        r %= b;
-    }
-    reverse(C.begin(), C.end());
-    while (C.size() > 1 && C.back() == 0) C.pop_back();
-    return C;
-}
-
    -
  • 高精度乘以高精度
  • -
-
cin>>a1>>b1;
-   int lena=strlen(a1);
-int lenb=strlen(b1);
-   for(i=1;i<=lena;i++)a[i]=a1[lena-i]-'0';
-   for(i=1;i<=lenb;i++)b[i]=b1[lenb-i]-'0';
-for(i=1;i<=lenb;i++)
-	for(j=1;j<=lena;j++)
-		c[i+j-1]+=a[j]*b[i];
-   for(i=1;i<lena+lenb;i++)
-	if(c[i]>9)
-	{
-		c[i+1]+=c[i]/10;
-		c[i]%=10;
-	}
-len=lena+lenb;
-   while(c[len]==0&&len>1)len--;
-

A+B Problem(高精)

-

A*B Problem(高精)

- - -
-
- - - -
-
- - - - - -
- - -
- -
-
- -
- -
-
- -
- - - - - - - - - - - - - - - - - - - -
- - \ No newline at end of file diff --git a/algorithm-knapsack-problem/index.html b/algorithm-knapsack-problem/index.html index 802aeb1..3d0e7e9 100644 --- a/algorithm-knapsack-problem/index.html +++ b/algorithm-knapsack-problem/index.html @@ -82,14 +82,14 @@

目录

-
  1. 1. 动态规划
  2. 2. 背包问题
    1. 2.1. 01背包问题
    2. 2.2. 完全背包问题
    3. 2.3. 多重背包物品
    4. 2.4. 分组背包问题
+
  1. 1. 动态规划
  2. 2. 背包问题
    1. 2.1. 01背包问题
    2. 2.2. 完全背包问题
    3. 2.3. 多重背包物品
    4. 2.4. 分组背包问题
-

动态规划

+

动态规划

    -
  • 状态表示f[i,j]f[i,j] +
  • 状态表示$f[i,j]$
    • 集合
    • 属性MaxMinCnt
    • @@ -101,28 +101,28 @@

-

背包问题

-

给定nn个物品和容量vv的背包每个物品都有体积viv_i和价值wiw_i求当i=1nviv\sum_{i=1}^{n} v_i \le v时最大的ww是多少

-

01背包问题

+

背包问题

+

给定$n$个物品和容量$v$的背包每个物品都有体积$v_i$和价值$w_i$求当$\sum_{i=1}^{n} v_i \le v$时最大的$w$是多少

+

01背包问题

每个物品只能用0/1次

-

f[i,j]=max(f[i1,j],f[i1,jvi]+wi)f[i,j] = max(f[i-1,j],f[i-1,j-v_i]+w_i)

+

$f[i,j] = max(f[i-1,j],f[i-1,j-v_i]+w_i)$

01背包问题

采药

-

完全背包问题

+

完全背包问题

物品可以无限次使用

-

f[i,j]=Max(f[i1,jvi×k]+w[i]×k)f[i,j] = Max(f[i-1,j-v_i \times k]+w[i] \times k)

-

k[0,jvi]k \subseteq [0,\frac{j}{v_i}]

-

f[i,j]=Max(f[i1,j],f[i1,jvi]+wi,f[i1,j2vi]+2wi,....,f[i1][jkvi]+kwi)f[i,j] = Max(f[i-1,j],f[i-1,j-v_i]+w_i,f[i-1,j-2v_i]+2w_i,....,f[i-1][j-kv_i]+kw_i)

-

f[i,jvi]=Max(f[i1][jvi],f[i1][j2vi]+wi,...,f[i1][jkvi]+(k1)wi)f[i,j-v_i] = Max(f[i-1][j-v_i],f[i-1][j-2v_i]+w_i,...,f[i-1][j-kv_i]+(k-1)w_i)

-

f[i][j]f[i][j]的后kk项等于f[i][jvi]+wif[i][j-v_i]+w_i

+

$f[i,j] = Max(f[i-1,j-v_i \times k]+w[i] \times k)$

+

$k \subseteq [0,\frac{j}{v_i}]$

+

$f[i,j] = Max(f[i-1,j],f[i-1,j-v_i]+w_i,f[i-1,j-2v_i]+2w_i,....,f[i-1][j-kv_i]+kw_i)$

+

$f[i,j-v_i] = Max(f[i-1][j-v_i],f[i-1][j-2v_i]+w_i,...,f[i-1][j-kv_i]+(k-1)w_i)$

+

$f[i][j]$的后$k$项等于$f[i][j-v_i]+w_i$

-

f[i,j]=Max(f[i1,j],f[i,jvi]+wi)f[i,j] = Max(f[i-1,j],f[i,j-v_i]+w_i)

+

$f[i,j] = Max(f[i-1,j],f[i,j-v_i]+w_i)$

完全背包问题

-

多重背包物品

+

多重背包物品

每个物品的个数不一致

朴素做法

-

f[i,j]=Max(f[i1,j],f[i1,jvi]+wi,f[i1,j2vi]+2wi,....,f[i1][jkvi]+kwi)f[i,j] = Max(f[i-1,j],f[i-1,j-v_i]+w_i,f[i-1,j-2v_i]+2w_i,....,f[i-1][j-kv_i]+kw_i)

-

k[0,si]k \subseteq [0,s_i]

+

$f[i,j] = Max(f[i-1,j],f[i-1,j-v_i]+w_i,f[i-1,j-2v_i]+2w_i,....,f[i-1][j-kv_i]+kw_i)$

+

$k \subseteq [0,s_i]$

三重循环即可

多重背包问题1

优化二进制优化

@@ -144,7 +144,7 @@

[cnt] = b*s; } }

-

对物品进行二进制分组组数为cntcnt转化为01背包问题求解

+

对物品进行二进制分组组数为$cnt$转化为01背包问题求解

n = cnt;
 for(int i=1;i<=n;i++){
     for(int j=0;j<=m;j++){
@@ -154,9 +154,9 @@ 

} cout<<f[n][m]<<endl;

多重背包问题2

-

分组背包问题

-

NN每一组只能选其中一种物品

-

f[i][j]=Max(f[i1,j],f[i1,jvi,k]+wi,k)f[i][j] = Max(f[i-1,j],f[i-1,j-v_{i,k}]+w_{i,k})

+

分组背包问题

+

$N$每一组只能选其中一种物品

+

$f[i][j] = Max(f[i-1,j],f[i-1,j-v_{i,k}]+w_{i,k})$

分组背包问题

diff --git a/algorithm-math/index.html b/algorithm-math/index.html index 1e38b6e..87932ea 100644 --- a/algorithm-math/index.html +++ b/algorithm-math/index.html @@ -82,26 +82,15 @@

目录

-
  1. 1. 质数
    1. 1.1. 试除法
    2. 1.2. 试除法分解质因数
    3. 1.3. 朴素筛法求素数
    4. 1.4. 线性筛法求素数
  2. 2. 约数
    1. 2.1. 试除法求所有约数
    2. 2.2. 约数个数和约数之和
    3. 2.3. 欧几里得算法求最大公约数
  3. 3. 欧拉函数
    1. 3.1. 筛法求欧拉函数
  4. 4. 快速幂
  5. 5. 扩展欧几里得算法
  6. 6. 中国剩余定理
  7. 7. 高斯消元
  8. 8. 组合数
    1. 8.1. 递推法求组合数
+
  1. 1. 质数
    1. 1.1. 试除法
    2. 1.2. 试除法分解质因数
    3. 1.3. 朴素筛法求素数
    4. 1.4. 线性筛法求素数
  2. 2. 约数
    1. 2.1. 试除法求所有约数
    2. 2.2. 约数个数和约数之和
    3. 2.3. 欧几里得算法求最大公约数
  3. 3. 欧拉函数
    1. 3.1. 筛法求欧拉函数
  4. 4. 快速幂
  5. 5. 扩展欧几里得算法
  6. 6. 中国剩余定理
  7. 7. 高斯消元
  8. 8. 组合数
    1. 8.1. 递推法求组合数
-

质数

+

质数

对于大于一的整数如果只包含一和本身这两个约数它就是质数也叫素数

-

试除法

-

O(n)O(\sqrt n)

+

试除法

+

$O(\sqrt n)$

bool is_prime(int x)
 {
     if (x < 2) return false;
@@ -110,7 +99,7 @@ 

试除法 return false; return true; }

-

试除法分解质因数

+

试除法分解质因数

void divide(int x)
 {
     for (int i = 2; i <= x / i; i ++ )
@@ -123,9 +112,9 @@ 

if (x > 1) cout << x << ' ' << 1 << endl; cout << endl; }

-

朴素筛法求素数

+

朴素筛法求素数

枚举每一个数如果它没有被筛则加入质数集合并且把它的所有倍数都筛掉

-

O(nloglogn)O(nloglogn)

+

$O(nloglogn)$

int primes[N], cnt;     // primes[]存储所有素数
 bool st[N];         // st[x]存储x是否被筛掉
 
@@ -139,7 +128,7 @@ 

[j] = true; } }

-

线性筛法求素数

+

线性筛法求素数

int primes[N], cnt;     // primes[]存储所有素数
 bool st[N];         // st[x]存储x是否被筛掉
 
@@ -155,8 +144,8 @@ 

} } }

-

约数

-

试除法求所有约数

+

约数

+

试除法求所有约数

vector<int> get_divisors(int x)
 {
     vector<int> res;
@@ -169,17 +158,17 @@ 

sort(res.begin(), res.end()); return res; }

-

约数个数和约数之和

-

如果 N = p1^c1 * p2^c2 * … *pk^ck
-约数个数 (c1 + 1) * (c2 + 1) * … * (ck + 1)
+

约数个数和约数之和

+

如果 N = p1^c1 * p2^c2 * … *pk^ck
+约数个数 (c1 + 1) * (c2 + 1) * … * (ck + 1)
约数之和 (p1^0 + p1^1 + … + p1^c1) * … * (pk^0 + pk^1 + … + pk^ck)

-

欧几里得算法求最大公约数

+

欧几里得算法求最大公约数

int gcd(int a, int b)
 {
     return b ? gcd(b, a % b) : a;
 }
-

欧拉函数

-

ϕ(n)\phi(n)1-n中与n互质的数的个数

+

欧拉函数

+

$\phi(n)$1-n中与n互质的数的个数

int phi(int x)
 {
     int res = x;
@@ -193,7 +182,7 @@ 

return res; }

-

筛法求欧拉函数

+

筛法求欧拉函数

int primes[N], cnt;     // primes[]存储所有素数
 int euler[N];           // 存储每个数的欧拉函数
 bool st[N];         // st[x]存储x是否被筛掉
@@ -222,8 +211,8 @@ 

} } }

-

快速幂

-

O(logk)O(logk)时间内求出求出akmodpa^k mod p

+

快速幂

+

$O(logk)$时间内求出求出$a^k mod p$

int qmi(int m, int k, int p)
 {
     int res = 1 % p, t = m;
@@ -235,7 +224,7 @@ 

快速幂 } return res; }

-

扩展欧几里得算法

+

扩展欧几里得算法

// 求x, y使得ax + by = gcd(a, b)
 int exgcd(int a, int b, int &x, int &y)
 {
@@ -248,11 +237,11 @@ 

-= (a/b) * x; return d; }

-

中国剩余定理

+

中国剩余定理

给定一些两两互质的数求解线性同余方程组

-

ToBeContinueTo Be Continue

-

高斯消元

-

O(n3)O(n^3)内求解线性方程组

+

$To Be Continue$

+

高斯消元

+

$O(n^3)$内求解线性方程组

// a[N][N]是增广矩阵
 int gauss()
 {
@@ -290,9 +279,9 @@ 

return 0; // 有唯一解 }

-

组合数

-

递推法求组合数

-

Cab=Ca1b+Ca1b1C_{a}^{b} = C_{a-1}^{b} + C_{a-1}^{b-1}

+

组合数

+

递推法求组合数

+

$C_{a}^{b} = C_{a-1}^{b} + C_{a-1}^{b-1}$

// c[a][b] 表示从a个苹果中选b个的方案数
 for (int i = 0; i < N; i ++ )
     for (int j = 0; j <= i; j ++ )
diff --git a/algorithm-minimum-spanning-tree/index.html b/algorithm-minimum-spanning-tree/index.html
index 3255b08..9b90f94 100644
--- a/algorithm-minimum-spanning-tree/index.html
+++ b/algorithm-minimum-spanning-tree/index.html
@@ -82,15 +82,15 @@ 

目录

-
  1. 1. 最小生成树
    1. 1.1. Prim算法
    2. 1.2. Kruskal算法
  2. 2. 二分图
    1. 2.1. 染色法
    2. 2.2. 匈牙利算法
+
  1. 1. 最小生成树
    1. 1.1. Prim算法
    2. 1.2. Kruskal算法
  2. 2. 二分图
    1. 2.1. 染色法
    2. 2.2. 匈牙利算法
-

最小生成树

-

Prim算法

+

最小生成树

+

Prim算法

处理稠密图

-

朴素Prim算法 O(n2)O(n^2)

+

朴素Prim算法 $O(n^2)$

类似dijkstra找出距离集合最短的点加入集合更新其他点到集合的距离

int n;      // n表示点数
 int g[N][N];        // 邻接矩阵存储所有边
@@ -121,9 +121,9 @@ 

Prim算 return res; }

-

堆优化Prim O(mlogn)O(mlogn) 不常用

-

Kruskal算法

-

O(mlogm)O(mlogm) 处理稀疏图

+

堆优化Prim $O(mlogn)$ 不常用

+

Kruskal算法

+

$O(mlogm)$ 处理稀疏图

  1. 将所有边按照权重排序
  2. 枚举每条边a->b,权重c 如果ab不联通则将边ab加入集合中
  3. @@ -172,11 +172,11 @@

    K }

模版最小生成树

买礼物

-

二分图

+

二分图

定义设G=(V,E)是一个无向图如果顶点V可分割为两个互不相交的子集(A,B)并且图中的每条边ij所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B)则称图G为一个二分图

一个图是二分图当且仅当图中不含有奇数环

-

染色法

-

O(n+m)O(n+m) 判断是否为二分图

+

染色法

+

$O(n+m)$ 判断是否为二分图

int n;      // n表示点数
 int h[N], e[M], ne[M], idx;     // 邻接表存储图
 int color[N];       // 表示每个点的颜色-1表示未染色0表示白色1表示黑色
@@ -211,8 +211,8 @@ 

染色法 } return flag; }

-

匈牙利算法

-

O(mn)O(mn)实际运行时间远小于O(mn)O(mn)

+

匈牙利算法

+

$O(mn)$实际运行时间远小于$O(mn)$

实现二分图的最大匹配

int n1, n2;     // n1表示第一个集合中的点数n2表示第二个集合中的点数
 int h[N], e[M], ne[M], idx;     // 邻接表存储所有边匈牙利算法中只会用到从第一个集合指向第二个集合的边所以这里只用存一个方向的边
diff --git a/algorithm-prefix-sum-and-difference/index.html b/algorithm-prefix-sum-and-difference/index.html
deleted file mode 100644
index e51a135..0000000
--- a/algorithm-prefix-sum-and-difference/index.html
+++ /dev/null
@@ -1,297 +0,0 @@
-
-
-
-  
-  
-  
-  前缀和与差分算法 | HawYiorのBlog
-  
-  
-  
-  
-  
-  
-  
-  
-  
-  
-    
-  
-  
-  
-  
-
-
-
-  
-
- - - -
-
- -
- - -
- - -

- 前缀和与差分算法 -

- - -
- - -
-

目录

-
  1. 1. 前缀和与差分
    1. 1.1. 一维前缀和
    2. 1.2. 二维前缀和
    3. 1.3. 一维差分
    4. 1.4. 二维差分
-
- -
- -

前缀和与差分

-

一对逆运算

-

一维前缀和

-

设有一列数据a1,a2,...,an1,an{a}_1,{a}_2,...,{a}_{n-1},{a}_n

-

定义Si=a1+a2+...+ai{S}_i=a_1+a_2+...+a_i

-

一般下标从1开始S0=0S_0=0

-

SiS_i的初始化: Si=Si1+aiS_i = S_{i-1}+a_i

-

作用

-

快速地求出原数组中一段区间数的和

-

对于区间[l,r][l,r]

-

i=lrai=SrSl1\sum_{i=l}^{r}a_i = S_r-S_{l-1}

-

二维前缀和

-

对于二维数组矩阵(a11a12...a1ja21a22...a2j............ai1ai2...aij)\begin{pmatrix} - a_{11}& a_{12} & ... & a_{1j}\\ - a_{21}& a_{22} & ... & a_{2j} \\ - ...& ... & ... & ...\\ - a_{i1}& a_{i2} & ... & a_{ij} -\end{pmatrix}

-

SijS_{ij}代表aija_{ij}左上角的所有元素和

-
    -
  • -

    对于点(i,j)(i,j)其二维前缀和SijS_{ij}的初始化

    -

    Sij=Si1,j+Si,j1Si1,j1+ai,jS_{ij}=S_{i-1,j}+S_{i,j-1}-S_{i-1,j-1}+a_{i,j}

    -
  • -
  • -

    设点(x1,y1)(x_1,y_1)(x2,y2)(x_2,y_2)的左上角则两点围成的矩形中所有元素和
    -S=Sx2,y2Sx2,y11Sx11,y2+Sx11,y11S=S_{x_2,y_2}-S_{x_2,y_1-1}-S_{x_1-1,y_2}+S_{x_1-1,y_1-1}

    -
  • -
-

一维差分

-

对一列数据a1,a2,a3,...,aia_1,a_2,a_3,...,a_i

-

构造b1,b2,b3,...,bib_1,b_2,b_3,...,b_i使得ai=b1+b2+...+bia_i=b_1+b_2+...+b_i

-

aabb的前缀和bb就是aa的差分

-

{b1=a1b2=a2a1b3=a3a2......bn=anan1\left\{\begin{matrix} -b_1=a_1\\ -b_2=a_2-a_1\\ -b_3=a_3-a_2\\ - ......\\ -b_n=a_n-a_{n-1} -\end{matrix}\right.

-

作用

-

若要把a1,a2,a3,...,aia_1,a_2,a_3,...,a_i[l,r][l,r]区间的aacc

-

只需要使bl+=c,br+1=cb_l+=c,b_{r+1}-=c

-

模版

-
import java.util.Scanner;
-
-public class Diff {
-    public static void main(String[] args) {
-
-        Scanner scanner = new Scanner(System.in);
-
-        // 给出n数组大小和k增加次数
-        int n = scanner.nextInt();
-        int k = scanner.nextInt();
-
-        // 搭建数组
-        int[] arr = new int[n+1];
-        int[] brr = new int[n+1];
-
-        // 为arr赋值
-        for (int i = 1; i < n+1; i++) {
-            arr[i] = scanner.nextInt();
-        }
-
-        // 为brr赋值
-        for (int i = 1; i < n+1; i++){
-            brr[i] = arr[i] - arr[i-1];
-        }
-
-        while (k-- > 0){
-            // 我们为arr的[l,r]区间加上c
-            int l = scanner.nextInt();
-            int r = scanner.nextInt();
-            int c = scanner.nextInt();
-
-            brr[l] += c;
-            brr[r+1] -= c;
-        }
-
-        // 计算输出结果即可这里输出的需要是由b累计出来的a
-        // 也可以使用注释代码最后输出arr即可
-        for (int i = 1; i < n+1; i++) {
-            brr[i] += brr[i-1];
-            //arr[i] = brr[i]+arr[i-1];
-        }
-
-        // 最后输出结果
-        for (int i = 1; i < n+1; i++) {
-            System.out.println(brr[i]);
-        }
-
-    }
-}
-

二维差分

-

原矩阵aija_{ij},差分矩阵bijb_{ij}

-

bx1,y1+=cb_{x1,y1}+=c

-

bx2+1,y=cb_{x2+1,y}-=c

-

bx1,y2+1=cb_{x1,y2+1}-=c

-

bx2+1,y2+1+=cb_{x2+1,y2+1}+=c

- - -
-
- - - -
-
- - - - - -
- - -
- -
-
- -
- -
-
- -
- - - - - - - - - - - - - - - - - - - -
- - \ No newline at end of file diff --git a/algorithm-search/index.html b/algorithm-search/index.html index 9f21fca..b76323a 100644 --- a/algorithm-search/index.html +++ b/algorithm-search/index.html @@ -82,21 +82,21 @@

目录

-
  1. 1. DFS与BFS
  2. 2. 树和图的存储
    1. 2.1. 树和图的遍历
    2. 2.2. 拓扑排序
+
  1. 1. DFS与BFS
  2. 2. 树和图的存储
    1. 2.1. 树和图的遍历
    2. 2.2. 拓扑排序
-

DFS与BFS

+

DFS与BFS

  • 深度优先搜索DFS
-

StackStack递归空间O(h)O(h)不具有最短性

+

$Stack$递归空间$O(h)$不具有最短性

题目全排列八皇后

  • 宽度优先搜索BFS
-

QueueQueue空间O(2h)O(2^h)最短路

+

$Queue$空间$O(2^h)$最短路

题目迷宫

回溯剪枝

烤鸡

@@ -110,15 +110,15 @@

DFS与BFS int dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1};

防止走相反的方向导致搜索回溯

if(i ^ 4 == d) continue;
-

树和图的存储

+

树和图的存储

树是特殊的无环连通图

-

有向图aba \to b

+

有向图$a \to b$

  • -

    邻接矩阵 g[a][b]g[a][b]

    +

    邻接矩阵 $g[a][b]$

  • -

    邻接表用链表储存点ii可以到达的点

    +

    邻接表用链表储存点$i$可以到达的点

// 对于每个点k开一个单链表存储k所有可以走到的点h[k]存储这个单链表的头结点
@@ -133,8 +133,8 @@ 

// 初始化 idx = 0; memset(h, -1, sizeof h);

-

树和图的遍历

-

时间复杂度O(n+m)O(n+m)n表示点数m表示边数

+

树和图的遍历

+

时间复杂度$O(n+m)$n表示点数m表示边数

  • 深度优先遍历
@@ -170,8 +170,8 @@

} } } -

拓扑排序

-

时间复杂度O(n+m)O(n+m)n表示点数m表示边数

+

拓扑排序

+

时间复杂度$O(n+m)$n表示点数m表示边数

有向无环图一定可以拓扑排序序列可能不唯一

入度出度有多少条边指向自己/从自己这里指出去

    @@ -179,7 +179,7 @@

    将入度为0的点入队

  1. -

    宽搜枚举队头的所有出边tjt \to j删掉tjt \to jtt的出度减一

    +

    宽搜枚举队头的所有出边$t \to j$删掉$t \to j$$t$的出度减一

bool topsort()
diff --git a/algorithm-shortest-path/index.html b/algorithm-shortest-path/index.html
index 8687661..043b527 100644
--- a/algorithm-shortest-path/index.html
+++ b/algorithm-shortest-path/index.html
@@ -82,42 +82,42 @@ 

目录

-
  1. 1. 最短路
    1. 1.1. 朴素dijkstra算法
    2. 1.2. 堆优化版dijkstra算法
    3. 1.3. Bellman-Ford算法
    4. 1.4. SPFA算法
    5. 1.5. Floyd算法
+
  1. 1. 最短路
    1. 1.1. 朴素dijkstra算法
    2. 1.2. 堆优化版dijkstra算法
    3. 1.3. Bellman-Ford算法
    4. 1.4. SPFA算法
    5. 1.5. Floyd算法
-

最短路

-

nn为点数mm为边数

-

mmn2n^2同一级别为稠密图nn同一级别为稀疏图

+

最短路

+

$n$为点数$m$为边数

+

$m$$n^2$同一级别为稠密图$n$同一级别为稀疏图

稠密图使用邻接矩阵储存稀疏图用邻接表储存

  • 单源最短路
    • 所有边权都是正数
        -
      • 朴素dijkstradijkstra算法 O(n2+m)O(n^2+m)
      • -
      • 堆优化版dijkstradijkstra算法 O(mlogn)O(mlogn)
      • +
      • 朴素$dijkstra$算法 $O(n^2+m)$
      • +
      • 堆优化版$dijkstra$算法 $O(mlogn)$
    • 存在负权边
        -
      • BellmanFordBellman-Ford算法 O(nm)O(nm)
      • -
      • SPFASPFA算法 一般O(m)O(m)最坏O(nm)O(nm)
      • +
      • $Bellman-Ford$算法 $O(nm)$
      • +
      • $SPFA$算法 一般$O(m)$最坏$O(nm)$
  • 多源汇最短路
      -
    • floydfloyd算法 O(n3)O(n^3)
    • +
    • $floyd$算法 $O(n^3)$
-

朴素dijkstra算法

+

朴素dijkstra算法

  1. -

    初始化距离$dist[1]=0,dist[i]=+\infty $st数组当前已经确定最短路径的点

    +

    初始化距离$dist[1]=0,dist[i]=+\infty $st数组当前已经确定最短路径的点

  2. 循环每一个点找到不在st中的最短距离点tt加入到st中用t更新其他点的距离

    @@ -151,7 +151,7 @@

    return dist[n]; }

一般边数m比较多所以使用邻接矩阵g[a][b]存储

-

堆优化版dijkstra算法

+

堆优化版dijkstra算法

将寻找距离最小的点的时间复杂度降低

堆可以使用手写堆或优先队列

typedef pair<int, int> PII;
@@ -195,7 +195,7 @@ 

if (dist[n] == 0x3f3f3f3f) return -1; return dist[n]; }

-

Bellman-Ford算法

+

Bellman-Ford算法

迭代n次每次遍历所有边对dist[b]进行更新

int n, m;       // n表示点数m表示边数
 int dist[N];        // dist[x]存储1到x的最短路距离
@@ -228,7 +228,7 @@ 

//遍历完后满足三角不等式 dist[b] <= dist[a] + w

可以用于找负环时间复杂度比较高

-

SPFA算法

+

SPFA算法

队列优化的Bellman-Ford算法

int n;      // 总点数
 int h[N], w[N], e[N], ne[N], idx;       // 邻接表存储所有边
@@ -321,7 +321,7 @@ 

SPFA算 }

模版单源最短路径弱化版

模版单源最短路径标准版

-

Floyd算法

+

Floyd算法

基于动态规划

初始化
     for (int i = 1; i <= n; i ++ )
diff --git a/algorithm-skills/index.html b/algorithm-skills/index.html
index 0583dd5..c5dc8cd 100644
--- a/algorithm-skills/index.html
+++ b/algorithm-skills/index.html
@@ -87,48 +87,26 @@ 

目录

-

一般竞赛时间限制在1s或2s所以时间复杂度尽量控制在10710810^7 - 10^8

+

一般竞赛时间限制在1s或2s所以时间复杂度尽量控制在$10^7 - 10^8$

下面给出在不同数据范围下代码的时间复杂度和算法如何选择

    -
  1. n30n \le 30dfs+剪枝状态压缩dp
  2. -
  3. n100n \le 100O(n3)O(n^3)Floyddp高斯消元
  4. -
  5. n1000n \le 1000O(n2)O(n^2)dp二分朴素Dijsktra朴素PrimBellman-Ford
  6. -
  7. n10000n \le 10000O(nn)O(n \sqrt n)块状链表分块莫队
  8. -
  9. n105n \le 10^5O(nlogn)O(nlogn)sort线段树树状数组set/mapheap拓扑排序堆优化Dijkstra堆优化PrimKruskalspfa二分CDQ分治整体二分后缀数组
  10. -
  11. n106n \le 10^6O(n)O(n)单调队列hash双指针BFS并查集kmpAC自动机常数比较小的O(nlogn)O(nlogn)sort树状数组heapdijkstraprim
  12. -
  13. n107n \le 10^7O(n)O(n)双指针扫描KmpAC自动机线性筛素数
  14. -
  15. n109n \le 10^9O(n)O(\sqrt n)判断质数
  16. -
  17. n1018n \le 10^{18}O(nlogn)O(nlogn)最大公约数快速幂数位dp
  18. -
  19. n101000n \le 10^{1000}O((logn)2)O((logn)^2)高精度加减乘除
  20. +
  21. $n \le 30$dfs+剪枝状态压缩dp
  22. +
  23. $n \le 100$$O(n^3)$Floyddp高斯消元
  24. +
  25. $n \le 1000$$O(n^2)$dp二分朴素Dijsktra朴素PrimBellman-Ford
  26. +
  27. $n \le 10000$$O(n \sqrt n)$块状链表分块莫队
  28. +
  29. $n \le 10^5$$O(nlogn)$sort线段树树状数组set/mapheap拓扑排序堆优化Dijkstra堆优化PrimKruskalspfa二分CDQ分治整体二分后缀数组
  30. +
  31. $n \le 10^6$$O(n)$单调队列hash双指针BFS并查集kmpAC自动机常数比较小的$O(nlogn)$sort树状数组heapdijkstraprim
  32. +
  33. $n \le 10^7$$O(n)$双指针扫描KmpAC自动机线性筛素数
  34. +
  35. $n \le 10^9$$O(\sqrt n)$判断质数
  36. +
  37. $n \le 10^{18}$$O(nlogn)$最大公约数快速幂数位dp
  38. +
  39. $n \le 10^{1000}$$O((logn)^2)$高精度加减乘除

一些常见数据类型的大小

  1. long long 内的最大阶乘 20!
  2. int 内的最大阶乘 12!
  3. -
  4. int => 2312^{31}21092*10^9
  5. -
  6. long long => 2632^{63}910189*10^{18}
  7. +
  8. int => $2^{31}$$2*10^9$
  9. +
  10. long long => $2^{63}$$9*10^{18}$
  11. float => 38位
  12. double => 308位
@@ -147,15 +125,6 @@

目录

- - - - -
-
-
- - -

- 二分查找与二分答案算法 -

- - -
-
diff --git a/archives/2023/05/index.html b/archives/2023/05/index.html deleted file mode 100644 index 494836f..0000000 --- a/archives/2023/05/index.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - 归档: 2023/5 | HawYiorのBlog - - - - - - - - - - - - - - - - -
-
- - - -
-
- - - - - - -
-
- 2023 -
-
- - - - - - - - -
- - - -
- -
-
- -
- -
-
- -
- - - - - - - - - - - - - - - - - - - -
- - \ No newline at end of file diff --git a/archives/2023/06/index.html b/archives/2023/06/index.html index 20b7ee0..35e9361 100644 --- a/archives/2023/06/index.html +++ b/archives/2023/06/index.html @@ -84,26 +84,6 @@

- - - -
diff --git a/archives/2023/10/index.html b/archives/2023/10/index.html index 3ab3b8c..594cac8 100644 --- a/archives/2023/10/index.html +++ b/archives/2023/10/index.html @@ -71,26 +71,6 @@

-

- 二进制相关 -

- - -
- -
- - - - - - - - - - + + + + diff --git a/archives/2023/page/2/index.html b/archives/2023/page/2/index.html index 8c05fbf..839878b 100644 --- a/archives/2023/page/2/index.html +++ b/archives/2023/page/2/index.html @@ -71,26 +71,6 @@

-

- Vue学习笔记 -

- - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - + + + + diff --git a/archives/page/2/index.html b/archives/page/2/index.html index 732b941..302e2ce 100644 --- a/archives/page/2/index.html +++ b/archives/page/2/index.html @@ -71,26 +71,6 @@

-

- Vue学习笔记 -

- - -
- -
- - - - - - - - - - - - - - - - - - - - - -
-
-
- - -

- 二分查找与二分答案算法 + 基础算法

-
diff --git a/binary/index.html b/binary/index.html deleted file mode 100644 index 71b69a9..0000000 --- a/binary/index.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - 二进制相关 | HawYiorのBlog - - - - - - - - - - - - - - - - - - -
-
- - - -
-
- -
- - -
- - -

- 二进制相关 -

- - -
- - -
-

目录

-
  1. 1. 基础运算
  2. 2. 正数、负数的表示
-
- -
- -

计算机以二进制表示数据以表示电路中的正反在二进制下一个位只有0和1逢二进一位

-

计算机中存储数据以字节为单位一个字节有8个位即可以表示-128~127范围的数字

-

基础运算

-
-

-
-

用符号&表示运算规律是真真为真真假为假假假为假一假即假

-
1&1 //1
-1&0 //0
-0&0 //0
-
-

-
-

用符号|表示运算规律是真真为真真假为真假假为假一真即真

-
1|1 //1
-1|0 //1
-0|0 //0
-
-

-
-

运算符为~取反的逻辑运算规律二进制位若为1取反后为0若为0取反后为1

-
~1 //11111110
-
-

左移

-
-

将二进制数向左移位操作高位溢出则丢弃低位补0

-
a=11;
-a<<1;
-移位前0000 1011
-移位后0001 0110十进制值为22
-

对一个数左移1位就是乘以2左移n位就是乘以2的n次方而左移运算比乘法快得多

-
-

右移

-
-

右移位运算中无符号数和有符号数的运算并不相同对于无符号数右移之后高位补0对于有符号数符号位一起移动正数高位补0负数高位补1

-
无符号数
-a=16;
-a>>3;
-移位前0001 0000
-移位后0000 0010十进制值为2
-
有符号数正数
-b=32;
-a>>3;
-移位前0010 0000
-移位后0000 0100十进制值位4
-
有符号数负数
-b=-32;
-b>>3;
-移位前1010 0000
-移位后1000 0100十进制值为-4
-
c=25;
-c>>4;
-移位前0001 1001
-移位后0000 0001十进制值为1
-

实际上我们发现右移n位就是除以2的n次方当得到的商不是整数时会往小取整

-

正数负数的表示

-

对于负数的表示比较特殊其有一条运算规律对非负数的二进制进行取反然后+1便可得其负数的二进制表示以3为例子

-
00000011//3的二进制
-//~00000011 对3进行取反得到结果
-11111100
-//对结果进行+1
-11111101//-3在计算机中的最终表示
-

最终得出在一个字节下11111101表示-3

- - -
-
- - - -
-
- - - - - -
- - -
- -
-
- -
- -
-
- -
- - - - - - - - - - - - - - - - - - - -
- - \ No newline at end of file diff --git "a/categories/\347\256\227\346\263\225/index.html" "b/categories/\347\256\227\346\263\225/index.html" index 5f67cda..24d5445 100644 --- "a/categories/\347\256\227\346\263\225/index.html" +++ "b/categories/\347\256\227\346\263\225/index.html" @@ -252,13 +252,13 @@

- 算法基础课1-3(杂乱) + 基础算法

-
@@ -269,11 +269,6 @@

- - diff --git "a/categories/\347\256\227\346\263\225/page/2/index.html" "b/categories/\347\256\227\346\263\225/page/2/index.html" deleted file mode 100644 index e227e6f..0000000 --- "a/categories/\347\256\227\346\263\225/page/2/index.html" +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - 分类: 算法 | HawYiorのBlog - - - - - - - - - - - - - - - - -
-
- - - -
-
- - - - - - -
-
- 2023 -
-
- - - - - - - - - - - - - - - - -
- - - - - -
- -
-
- -
- -
-
- -
- - - - - - - - - - - - - - - - - - - -
- - \ No newline at end of file diff --git "a/categories/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/index.html" "b/categories/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/index.html" deleted file mode 100644 index b2049eb..0000000 --- "a/categories/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/index.html" +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - 分类: 计算机基础 | HawYiorのBlog - - - - - - - - - - - - - - - - -
-
- - - -
-
- - - - - - -
-
- 2023 -
-
- - - - -
- - - -
- -
-
- -
- -
-
- -
- - - - - - - - - - - - - - - - - - - -
- - \ No newline at end of file diff --git a/index.html b/index.html index 120a23f..6d7d753 100644 --- a/index.html +++ b/index.html @@ -61,7 +61,7 @@

diff --git a/index.md/index.html b/index.md/index.html index be489b9..a884235 100644 --- a/index.md/index.html +++ b/index.md/index.html @@ -55,53 +55,6 @@

- - - - -
+

Make sure to include the CSS and font files in both cases.
+If you are doing all rendering on the server, there is no need to include the
JavaScript on the client.

-

The examples above use the throwOnError: false option, which renders invalid
-inputs as the TeX source code in red (by default), with the error message as
-hover text. For other available options, see the
-API documentation,
-options documentation, and
+

The examples above use the throwOnError: false option, which renders invalid
+inputs as the TeX source code in red (by default), with the error message as
+hover text. For other available options, see the
+API documentation,
+options documentation, and
handling errors documentation.

-

Demo and Documentation

+

Demo and Documentation

Learn more about using KaTeX on the website!

-

Contributors

-

Code Contributors

-

This project exists thanks to all the people who contribute code. If you’d like to help, see our guide to contributing code.
+

Contributors

+

Code Contributors

+

This project exists thanks to all the people who contribute code. If you’d like to help, see our guide to contributing code.
Code contributors

-

Financial Contributors

+

Financial Contributors

Become a financial contributor and help us sustain our community.

-

Individuals

+

Individuals

Contribute on Open Collective

-

Organizations

+

Organizations

Support this project with your organization. Your logo will show up here with a link to your website.

-

Organization 1
-Organization 2
-Organization 3
-Organization 4
-Organization 5
-Organization 6
-Organization 7
-Organization 8
-Organization 9
+

Organization 1
+Organization 2
+Organization 3
+Organization 4
+Organization 5
+Organization 6
+Organization 7
+Organization 8
+Organization 9
Organization 10

-

License

+

License

KaTeX is licensed under the MIT License.

diff --git a/paper-deep-learning-detect-BOD5/index.html b/paper-deep-learning-detect-BOD5/index.html index 063691b..874e99a 100644 --- a/paper-deep-learning-detect-BOD5/index.html +++ b/paper-deep-learning-detect-BOD5/index.html @@ -82,22 +82,22 @@

目录

-
  1. 1. 概要
  2. 2. 1.介绍
    1. 2.1. 1.1.背景
    2. 2.2. 1.2 文献综述
+
  1. 1. 概要
  2. 2. 1.介绍
    1. 2.1. 1.1.背景
    2. 2.2. 1.2 文献综述

Soft detection of 5-day BOD with sparse matrix in city harbor water using deep learning techniques

-

概要

-

​ 对于像纽约这样的沿海城市如何更好地控制和管理港口水质是一项重要的任务为了实现这样的需求管理者们和政府需要追踪关键的水质指标例如温度pH值和溶解氧在这些指标当中五日生化需氧量BOD5BOD_5是一个需要花费许多时间与精力来检测的重要指标无论在学术上还是在工程上都造成了很大不便现有的实验和统计方法无法有效解决检测时间问题且提供的精度有限 此外由于各种人为操作失误与设备误差用于BODBOD检测和预测的数据包含许多缺失值导致矩阵稀疏很少有研究在开发统计检测方法时解决稀疏矩阵问题为了解决这些误差我们提出了一种基于深度学习的模型该模型结合了深度矩阵分解DMFDMF和深度神经网络DNNDNN该模型能够更加智能地解决稀疏矩阵问题更准确地预测BODBOD为了测试其有效性我们依据32323个水样对纽约市港口水域进行了案例研究结果表明该方法比传统矩阵补全方法降低了11.54%-17.23%的RMSERMSE比传统的机器学习算法降低了19.20%-25.16%的RMSERMSE

+

概要

+

​ 对于像纽约这样的沿海城市如何更好地控制和管理港口水质是一项重要的任务为了实现这样的需求管理者们和政府需要追踪关键的水质指标例如温度pH值和溶解氧在这些指标当中五日生化需氧量$BOD_5$是一个需要花费许多时间与精力来检测的重要指标无论在学术上还是在工程上都造成了很大不便现有的实验和统计方法无法有效解决检测时间问题且提供的精度有限 此外由于各种人为操作失误与设备误差用于$BOD$检测和预测的数据包含许多缺失值导致矩阵稀疏很少有研究在开发统计检测方法时解决稀疏矩阵问题为了解决这些误差我们提出了一种基于深度学习的模型该模型结合了深度矩阵分解$DMF$和深度神经网络$DNN$该模型能够更加智能地解决稀疏矩阵问题更准确地预测$BOD$为了测试其有效性我们依据32323个水样对纽约市港口水域进行了案例研究结果表明该方法比传统矩阵补全方法降低了11.54%-17.23%的$RMSE$比传统的机器学习算法降低了19.20%-25.16%的$RMSE$

-

RMSE(Root mean squared error): 剩余标准差SES_E也称均方差统计学概念在线性回归分析中真实值和估计值之间的差称为残差或者剩余量所有预测值的残差平方和或者剩余平方和剩余标准差就是剩余平方和的开平方用来表示估计值的精度)

-

1.介绍

-

1.1.背景

+

RMSE(Root mean squared error): 剩余标准差$S_E$也称均方差统计学概念在线性回归分析中真实值和估计值之间的差称为残差或者剩余量所有预测值的残差平方和或者剩余平方和剩余标准差就是剩余平方和的开平方用来表示估计值的精度)

+

1.介绍

+

1.1.背景

​ 港口水由自然或人为屏障形成是最为重要的地表水组成之一对于纽约旧金山香港和上海等城市港口流入了大部分城市雨水和城市污水然而在某些情况下这些污水很少能得到处理以至于在城市港口造成各种水污染细菌过量的营养物质有毒化学物质和其他污染物会影响周边人群的健康也危机海洋生物为了减少其对环境的严重影响城市管理者投入了大量精力控制和改善港口水质例如纽约市在过去十年投入了超过120亿美元升级城市下水道系统减少港口水的环境影响旧金山从2008年起已向旧金山港口水质改善基金会拨款超过5000多万美元香港推出了不同类型的总体规划包括保护港口用水的污染者罚款政策

-

为了更好地控制和管理港口水质对关键的质量指标进行追踪是很重要的例如温度溶解氧pH营养素和金属这些水质指标中许多可以通过现代传感器进行实时监测然而有一个关键指标不仅体现了水质的关键信息而且需要花费大量时间和精力进行检测生化需氧量(BOD)指标这个指标的定义是需氧生物在特定温度通常为20℃在特定时间段内通常为5天标记为BOD5BOD_5内分解水中有机物所需要的溶解氧量如果BOD含量过高水中溶解氧可能被耗尽导致需氧生物难以生存因此监测水质时测量BOD5BOD_5含量是十分重要的

-

​ 尽管BOD5BOD_5是一项十分有价值的指标但是其测量时间会造成很大的限制根据标准BOD样品的保存时间为采集后的48小时测试本身需要5天的潜伏期这种时间约束导致了管理和研究的各种弊端该问题引起了人们的广泛关注

-

1.2 文献综述

+

为了更好地控制和管理港口水质对关键的质量指标进行追踪是很重要的例如温度溶解氧pH营养素和金属这些水质指标中许多可以通过现代传感器进行实时监测然而有一个关键指标不仅体现了水质的关键信息而且需要花费大量时间和精力进行检测生化需氧量(BOD)指标这个指标的定义是需氧生物在特定温度通常为20℃在特定时间段内通常为5天标记为$BOD_5$内分解水中有机物所需要的溶解氧量如果BOD含量过高水中溶解氧可能被耗尽导致需氧生物难以生存因此监测水质时测量$BOD_5$含量是十分重要的

+

​ 尽管$BOD_5$是一项十分有价值的指标但是其测量时间会造成很大的限制根据标准BOD样品的保存时间为采集后的48小时测试本身需要5天的潜伏期这种时间约束导致了管理和研究的各种弊端该问题引起了人们的广泛关注

+

1.2 文献综述

diff --git a/tools/index.html b/tools/index.html index 39f0932..8287cff 100644 --- a/tools/index.html +++ b/tools/index.html @@ -11,13 +11,13 @@ - +Spring"> @@ -92,13 +92,13 @@

-

思维导图/设计类

+

思维导图/设计类

-

JavaWeb框架类

+

JavaWeb框架类

-

前端相关

+

前端相关

-

其他

+

其他

-
+

持续更新中~

diff --git a/vue/index.html b/vue/index.html index 5715b15..e6e7cac 100644 --- a/vue/index.html +++ b/vue/index.html @@ -82,41 +82,41 @@

目录

-
  1. 1. 代码风格
  2. 2. 准备工作
  3. 3. 文件目录
  4. 4. 模版语法
  5. 5. 属性绑定
  6. 6. 条件渲染
  7. 7. 列表渲染
  8. 8. 通过key管理状态
  9. 9. 事件处理
  10. 10. 事件参数
  11. 11. 事件修饰符
  12. 12. 数组变化侦测
  13. 13. 计算属性
  14. 14. Class绑定
  15. 15. Style绑定
  16. 16. 侦听器
  17. 17. 表单输入绑定
  18. 18. 模版引用
  19. 19. 组件组成
  20. 20. 组件嵌套关系
  21. 21. 组件注册方式
  22. 22. 组件传递数据-Props
  23. 23. 组件传递多种数据类型
  24. 24. 组件传递Props效验
  25. 25. 组件事件
  26. 26. 组件事件配合v-model
  27. 27. 组件数据传递
  28. 28. 透传Attribute
  29. 29. 插槽Slots
  30. 30. 组件生命周期
  31. 31. 生命周期应用
  32. 32. 动态组件
  33. 33. 组件保持存活
  34. 34. 异步组件
  35. 35. 依赖注入
  36. 36. Vue应用
    1. 36.1. 应用实例
    2. 36.2. 根组件
    3. 36.3. 挂载应用
    4. 36.4. 公共资源
+
  1. 1. 代码风格
  2. 2. 准备工作
  3. 3. 文件目录
  4. 4. 模版语法
  5. 5. 属性绑定
  6. 6. 条件渲染
  7. 7. 列表渲染
  8. 8. 通过key管理状态
  9. 9. 事件处理
  10. 10. 事件参数
  11. 11. 事件修饰符
  12. 12. 数组变化侦测
  13. 13. 计算属性
  14. 14. Class绑定
  15. 15. Style绑定
  16. 16. 侦听器
  17. 17. 表单输入绑定
  18. 18. 模版引用
  19. 19. 组件组成
  20. 20. 组件嵌套关系
  21. 21. 组件注册方式
  22. 22. 组件传递数据-Props
  23. 23. 组件传递多种数据类型
  24. 24. 组件传递Props效验
  25. 25. 组件事件
  26. 26. 组件事件配合v-model
  27. 27. 组件数据传递
  28. 28. 透传Attribute
  29. 29. 插槽Slots
  30. 30. 组件生命周期
  31. 31. 生命周期应用
  32. 32. 动态组件
  33. 33. 组件保持存活
  34. 34. 异步组件
  35. 35. 依赖注入
  36. 36. Vue应用
    1. 36.1. 应用实例
    2. 36.2. 根组件
    3. 36.3. 挂载应用
    4. 36.4. 公共资源
-

代码风格

+

代码风格

Vue2选项式API

Vue3组合式API

-

准备工作

-

首先配置Node.jsNode.js环境然后

+

准备工作

+

首先配置$Node.js$环境然后

npm init vue@latest

-

初始化名称namename不要用大写字母

-

一路勾选NONO

-

IDE使用VSCodeVSCode+VolarVolar插件

-

进入namename文件夹cd name

+

初始化名称$name$不要用大写字母

+

一路勾选$NO$

+

IDE使用$VSCode$+$Volar$插件

+

进入$name$文件夹cd name

执行npm install

npm run dev即可运行项目

-

文件目录

+

文件目录

node_modules 依赖文件夹

public 资源文件夹

src 源码文件夹

index.html 入口HTML文件

package.json 信息描述文件

vite.config.js Vue配置文件

-

模版语法

+

模版语法

  • 文本插值
-

{{msg}}其中可以使用JavaScrpitJavaScrpit表达式

+

{{msg}}其中可以使用$JavaScrpit$表达式

{{number +1}} {{ok ? 'Yes' : 'No'}}{{msg.split('')}}

  • 原始html

​ 使用v-html

-

属性绑定

+

属性绑定

v-bind

文本的绑定使用{{}}绑定而属性idclass等的绑定使用v-bind

<div v-bind:id="ID" v-bind:class="MyClass">
@@ -129,31 +129,31 @@ 

属 {{msg}} </div>

将属性存进同一个对象可以实现一次性绑定多个值

-

条件渲染

+

条件渲染

v-if v-else v-else-if v-show

v-if:如果初次渲染时为false就不会被渲染有较高的切换开销

v-show:无论初始值如何都会被渲染后续根据CSS的display属性切换有较高的初始渲染开销

如果需要频繁切换用v-show

-

列表渲染

+

列表渲染

v-for指令基于item in items

如果要获取下标使用(item,index) in items

对于对象数组则是(value,key,index)

-

通过key管理状态

+

通过key管理状态

Vue默认按照就地更新重新渲染消耗性能

不推荐Key绑定index而是绑定id等唯一索引属性

-

事件处理

+

事件处理

使用v-on或者@监听DOM事件

  • 内联事件处理器内联JS语句
  • 方法事件处理器指向方法
-

事件参数

+

事件参数

在方法中传递参数到事件中

add(count){
 	this.num += count;
 }

传递$event获取JS的event对象

-

事件修饰符

+

事件修饰符

简化代码

文档

<!-- 阻止单击事件继续传播 -->
@@ -175,7 +175,7 @@ 

-

数组变化侦测

+

数组变化侦测

  • 变更方法
@@ -186,11 +186,11 @@

赋值到的是新数组

concat()filter()slice()

-

计算属性

+

计算属性

描述依赖响应式状态的复杂逻辑

computed方法中进行计算属性

具有缓存所以性能优于常规方法调用

-

Class绑定

+

Class绑定

vue中对于class的v-bind得到加强表达式除了字符串以外还可以是数组或者对象

//template:
 <p :class="classObject">
@@ -210,7 +210,7 @@ 

Class .danger{ color:red }

-

Style绑定

+

Style绑定

vue中对于style的v-bind得到加强表达式除了字符串以外还可以是数组或者对象

//template:
 <p :style:"styleObject">
@@ -222,7 +222,7 @@ 

Style activeColor: red, activeSize: 30 }

-

侦听器

+

侦听器

使用watch选项在每次响应式属性发生变化时触发一个函数

//data:
 message: "Hello"
@@ -234,14 +234,14 @@ 

侦听器 console.log("old=>"+oldValue); }

注意watch的方法名必须和data中数据变量名一致

-

表单输入绑定

+

表单输入绑定

v-model

将表单输入和响应式属性进行双向绑定

提供修饰符.lazy .number .trim对输入进行过滤

.lazy 失去焦点才绑定

.number 只接受数字

.trim 去除前后空格

-

模版引用

+

模版引用

一般来说

内容改变

属性改变 v-bind: 指令

@@ -253,7 +253,7 @@

模 this.$refs.container.属性

如果没有特殊需求不要使用ref比较消耗性能

-

组件组成

+

组件组成

组件的最大优势就是可复用性

定义在.vue文件中

组件构成template,script,style

@@ -265,9 +265,9 @@

对于一个组件必须存在template其他可以没有

style中scoped属性表示让当前样式只在当前组件中生效

-

组件嵌套关系

+

组件嵌套关系

null

-

组件注册方式

+

组件注册方式

全局注册和局部注册

全局注册

main.js

@@ -284,7 +284,7 @@

组件传递数据-Props

+

组件传递数据-Props

使用props进行组件之间的数据传递

<Child title="数据"/>

Child.vue

@@ -296,9 +296,9 @@

注意事项props传递数据只能从父级到子级不能反其道而行

-

组件传递多种数据类型

+

组件传递多种数据类型

此外props还能传递除了字符串以外的数据类型例如数字数组对象等

-

组件传递Props效验

+

组件传递Props效验

props{
 	title{
 		type: String,
@@ -317,7 +317,7 @@ 

Props是只读的不允许进行修改父元素传递过来的数据

-

组件事件

+

组件事件

$emit触发自定义事件达到组件之间的数据传递

在子级元素中this.$emit(“someEvent”,data)

即可在父元素中

@@ -329,14 +329,14 @@

组 }

父传子props

子传父$emit

-

组件事件配合v-model

+

组件事件配合v-model

在侦听器watch中进行$emit传递v-model数据的newValue

-

组件数据传递

+

组件数据传递

props实现子传父

将传递的数据类型设置为Function

-

透传Attribute

+

透传Attribute

×

-

插槽Slots

+

插槽Slots

为子组件传递一些模版片段在子组件中渲染这些片段

App.vue中

<template>
@@ -376,7 +376,7 @@ 

<slot name="main"></slot>

选定具体需要的内容

其中v-slot可以简写为#

-

组件生命周期

+

组件生命周期

创建期挂载期更新期销毁期

beforeCreate 组件创建之前

created 组件创建之后

@@ -386,7 +386,7 @@

生命周期应用

+

生命周期应用

  • 通过ref获取DOM结构
@@ -395,22 +395,22 @@

动态组件

+

动态组件

<component :is="ComponentData"></component>
-

组件保持存活

+

组件保持存活

使用动态组件切换组件时被切换的组件会被卸载使用<keep-alive>强制使组件保持存活

<keep-alive>
 	<component :is="ComponentData"></component>
 </keep-alive>

保持存活不会被卸载 数据不会被重新初始化

-

异步组件

+

异步组件

<script>
     import defineAsyncComponent from 'vue'
     const ComponentB = defineAsyncComponent(()=>{
         import("/ComponentB.vue")
     })
 </script>
-

依赖注入

+

依赖注入

props逐级透传可以用provideinject解决

上级组件

provide{
@@ -429,22 +429,22 @@ 

只能由上到下不能反向传递

可以在main.js提供全局数据

app.provide("global","123")
-

Vue应用

-

应用实例

+

Vue应用

+

应用实例

每一个vue应用都是通过createApp函数创建

import {createApp} from 'vue'
 const app = createApp({
 	//根组件选项
 })

一个Vue项目中有且只有一个Vue实例对象

-

根组件

+

根组件

import App from './App.vue'
const app = createApp(App);
-

挂载应用

+

挂载应用

应用实例调用了.mount()才能渲染出来该方法接受一个容器参数

app.mount('#app')
<div id="app"></div>
-

公共资源

+

公共资源

位于.assets下存放公共资源包括css文件图片字体等