十三、聚类算法

六、聚类算法实战

一、聚类

聚类是一种无监督的机器学习任务,可以自动将数据划分为类cluster,因此聚类分组不需要提前被告知所划分的组应该是什么样子的。因为我们甚至可能都不知道我们在寻找什么,所以聚类是用于知识发现而不是预测。
聚类原则是一个组内的记录彼此必须非常相似,而与该组之外的记录截然不同,所有聚类做的就是遍历所有的数据然后找到这些相似性。

二、K-Means(均值)

①选择K个初始的簇中心,该点可以是随机的,也可以是人为的
②某一个样本和某一个聚类中心的距离
③计算所属聚类的样本均值
在这里插入图片描述
在这里插入图片描述
②③循环往复迭代,直到不发生任何变化就停止

三、K-Mediods(中位数)

数组1,2,3,4,100的均值为22,要是通过K-Means求均值的话,离里面大多数的数值还是比较远的
取中位数3的话,更好一些,因为100是个噪声点

四、二分K-Means

两个簇里面的样本数量都很小,两个簇中心很近,两个MSE很小,合并,簇中心离得很远,MSE很大,分开
若发现两个簇中心比较近,就把这两个簇进行合并
若发现某个簇离其他簇都比较远,而且该簇里面点又特别多,那就把这个簇分成两部分
在这里插入图片描述
在这里插入图片描述

五、K-Means++

选择初始化簇中心稍微远一点
随机选择第一个
算每个样本到第一个样本距离,样本距离可以算成概率
概率化选择
在这里插入图片描述

六、Mini Batch K-Means

本质上,以上用的是BGD批量梯度下降,而Mini Batch K-Means使用的是SGD随机梯度下降
从每个簇中不选择全部求均值,而是选择一部分求均值
速度快,数据量大的时候可以选择
在这里插入图片描述

七、如何确定K聚类数

Ⅰ,肘部法

也就是找拐点位置
在这里插入图片描述

Ⅱ,K均值损失函数

假定数据点分布符合高斯分布在这里插入图片描述

K个高斯分布混合得到得样本数据分布为在这里插入图片描述
最大似然估计在这里插入图片描述

似然函数取最大值
概率密度相乘再各个族似然相乘,找到哪些个μ可以使得取最大值,这个就是K均值得损失函数(从机器学习角度重新看待平方误差)
在这里插入图片描述

Ⅲ,求偏导

公式化解释K均值在这里插入图片描述
所以K均值假设了高斯混合模型,GMM,并且假设了方差sigma是一样的
K均值是在给定损失函数的情况下,梯度下降的一个应用
高斯混合分布不是线性回归凸函数,有多个极小值
K-Means++或者多算几次
淬火法或遗传算法来计算全局最优解

八,不同的K聚类情况

K-Means适用于拿圈来绘制类别,并不适合不规则形状的划分
K=4
K=6
K=5

九、数据分布对K-Means的影响

代码实现

import numpy as np
import matplotlib.pyplot as plt
import sklearn.datasets as ds
import matplotlib.colors
from sklearn.cluster import KMeans
from sklearn.cluster import MiniBatchKMeansdef expand(a, b):d = (b - a) * 0.1return a-d, b+dif __name__ == "__main__":N = 400#创建400个样本centers = 4#有4个类别data, y = ds.make_blobs(N, n_features=2, centers=centers, random_state=2)#创建一些聚类的模拟数据data2, y2 = ds.make_blobs(N, n_features=2, centers=centers, cluster_std=(1, 2.5, 0.5, 2), random_state=2)data3 = np.vstack((data[y == 0][:], data[y == 1][:50], data[y == 2][:20], data[y == 3][:5]))y3 = np.array([0] * 100 + [1] * 50 + [2] * 20 + [3] * 5)cls = KMeans(n_clusters=4, init='k-means++')y_hat = cls.fit_predict(data)y2_hat = cls.fit_predict(data2)y3_hat = cls.fit_predict(data3)m = np.array(((1, 1), (1, 3)))data_r = data.dot(m)y_r_hat = cls.fit_predict(data_r)matplotlib.rcParams['font.sans-serif'] = [u'SimHei']matplotlib.rcParams['axes.unicode_minus'] = Falsecm = matplotlib.colors.ListedColormap(list('rgbm'))plt.figure(figsize=(9, 10), facecolor='w')plt.subplot(421)plt.title(u'原始数据')plt.scatter(data[:, 0], data[:, 1], c=y, s=30, cmap=cm, edgecolors='none')x1_min, x2_min = np.min(data, axis=0)x1_max, x2_max = np.max(data, axis=0)x1_min, x1_max = expand(x1_min, x1_max)x2_min, x2_max = expand(x2_min, x2_max)plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)plt.subplot(422)plt.title(u'KMeans++聚类')plt.scatter(data[:, 0], data[:, 1], c=y_hat, s=30, cmap=cm, edgecolors='none')plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)plt.subplot(423)plt.title(u'旋转后数据')plt.scatter(data_r[:, 0], data_r[:, 1], c=y, s=30, cmap=cm, edgecolors='none')x1_min, x2_min = np.min(data_r, axis=0)x1_max, x2_max = np.max(data_r, axis=0)x1_min, x1_max = expand(x1_min, x1_max)x2_min, x2_max = expand(x2_min, x2_max)plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)plt.subplot(424)plt.title(u'旋转后KMeans++聚类')plt.scatter(data_r[:, 0], data_r[:, 1], c=y_r_hat, s=30, cmap=cm, edgecolors='none')plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)plt.subplot(425)plt.title(u'方差不相等数据')plt.scatter(data2[:, 0], data2[:, 1], c=y2, s=30, cmap=cm, edgecolors='none')x1_min, x2_min = np.min(data2, axis=0)x1_max, x2_max = np.max(data2, axis=0)x1_min, x1_max = expand(x1_min, x1_max)x2_min, x2_max = expand(x2_min, x2_max)plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)plt.subplot(426)plt.title(u'方差不相等KMeans++聚类')plt.scatter(data2[:, 0], data2[:, 1], c=y2_hat, s=30, cmap=cm, edgecolors='none')plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)plt.subplot(427)plt.title(u'数量不相等数据')plt.scatter(data3[:, 0], data3[:, 1], s=30, c=y3, cmap=cm, edgecolors='none')x1_min, x2_min = np.min(data3, axis=0)x1_max, x2_max = np.max(data3, axis=0)x1_min, x1_max = expand(x1_min, x1_max)x2_min, x2_max = expand(x2_min, x2_max)plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)plt.subplot(428)plt.title(u'数量不相等KMeans++聚类')plt.scatter(data3[:, 0], data3[:, 1], c=y3_hat, s=30, cmap=cm, edgecolors='none')plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)#plt.tight_layout(2, rect=(0, 0, 1, 0.97))plt.tight_layout()plt.suptitle(u'数据分布对KMeans聚类的影响', fontsize=18)# https://github.com/matplotlib/matplotlib/issues/829# plt.subplots_adjust(top=0.92)plt.show()# plt.savefig('cluster_kmeans')

在这里插入图片描述

十、Canopy算法

K-Means聚类都是多次的迭代进行划分,而Canopy仅进行一次迭代出结果
一次迭代很多情况下对机器学习并不是特别的适用
Canopy一次迭代的主要目的是:找到初始的K个中心点!有两个超参数T1和T2

聚类流程:①找初始的中心点 ②进行相对于的隶属关系点的划分

Canopy与K-Means区别:
①Canopy会让周围的点不再可能成为新的中心点,这样使得划分的比较均匀
②K-Means中的类别K需要指定,但Canopy算法中不需要指定K,有多少的类别就看所有点都归结为某类时,停止迭代之后有系统划分为多少类
③Canopy中的点可能会被划分为多个类别中去
④Canopy是一次迭代,一般一次迭代的东西并不是特别好
⑤K-Means难点在于K个中心点的选取,一般人们普遍通过Canopy来选出中心点,然后人为的把中心点给传给K-Means,Canopy常用作先验知识。
在这里插入图片描述
首先随机找到一个中心点,黑色的点
以T2为半径画圈,再这个圈内都的点,也就是黄色的点,和黑色点为同一个类别,这些黄色的点将来不会被随机选择为中心点
以T1为半径,再这个圈内且在T2圈外,也就是蓝色的点,和黑色的点也为同一个类别,这些蓝色的点将来可能会被随机选择为其他簇的中心点
另外在T1全外的红色的点,就和黑色的点不属于同一个类别

例如K=3时,随机选择黑色点为中心点,其中黄色的点和蓝色的点都归结为和黑色点为同一个类别
区分第二个类别时,黄色的不会再动了,随机再从蓝色点和红色点选取一个中心点,以该中心点T1和T2圈内进行划分新的类别,以此类推进行划分新的类别,最后实现类别划分。
收敛条件为所有的点都已经被划分到其中任意一个类别中了
在这里插入图片描述
很显然,有的点会被划分为多个类别

十一、层次聚类

与无监督的决策树类似
常用于存在包含关系的数据分类,例如:省市县等

Ⅰ分裂的层次聚类:DIANA

把原始数据集去不断的分裂,然后去计算每个子数据集里面的相似性,然后不断的分裂,把数据集分为很多的类别

Ⅱ凝聚的层次聚类:AGNES

把一个个样本,不断的自底向上的聚类,然后一层一层的来聚,最后聚成一个完整的数据集,这种用的更多一些
在这里插入图片描述

Ⅲ如何凝聚

如果两个样本,可以很好的度量距离,如果已经聚了一层,如何度量簇之间的相似性
①最小距离:两个簇中,最接近样本的距离,城市和城市边界最短距离,成链状一条线了
②最大距离:两个簇中,最远的样本的距离,某一个簇存在异常值就很麻烦,簇本身比较狭长
③平均距离:两两样本距离的平均、两两样本距离的平方和

十二、密度聚类

统计样本周边的密度,把密度给定一个阈值,不断的把样本添加到最近的簇
应用场景:人口密度,根据密度,聚类出城市
解决类似圆形的K-Means聚类的缺点,密度聚类缺点计算复杂度大,空间索引来降低计算时间,查找速度会有所降低
密度聚类可能会使得某个点没有任何类别
在这里插入图片描述

K-Means聚类针对的是圆形的,对于一些不规则的数据不好聚类,此时就可以通过密度聚类来进行弥补
在这里插入图片描述

Ⅰ,DBSCAN

Density Based Spatial Clustering of Applications with Noise
对象邻域:给定对象在半径内的区域
在这里插入图片描述
如果给定5为阈值,那么q是7,p是3,那么q是核心对象
而p是在q这个范围(制定一个半径)内的,那么说q到p是核心密度可达
q密度可达p1,p1密度可达p,那么q到p是密度可达
在这里插入图片描述

举例子,层次聚类
如果P密度可达A,B,C,那就把它们连接在一起
A可达E,F,B不是核心对象,C可达G
所有点都要进行是否是核心对象的判定
那么这些点同属于一个簇,最后没有更多样本可以加进来,这个时候扫描结束
不位于簇中的点就是噪声
K不需要给定,只给m个阈值,和半径r
一般常用作划分不规则区域,即非圆形

Ⅱ,密度可达

从o点能密度可达q,也能密度可达p,p和q叫密度相连
在这里插入图片描述
簇就是密度相连的最大的点的集合,即最大的密度相连构成的集合就是簇
如何一个点不是核心对象,也不能被别的点密度可达,就是噪声
在这里插入图片描述

Ⅲ,传入参数

给定的m个数不够,簇会变多,一般发生在边缘处

r=0.1,半径为0.1
m=5,一个圈内有5个点才算可以形成一个簇
在这里插入图片描述
r=0.1,半径为0.1
m=3,一个圈内有3个点才算可以形成一个簇
在这里插入图片描述
r=0.1,半径为0.1
m=2,一个圈内有2个点才算可以形成一个簇
在这里插入图片描述
不同的半径,r的值不同,太大就都聚到一块了
在这里插入图片描述

代码实现

# !/usr/bin/python
# -*- coding:utf-8 -*-import numpy as np
import matplotlib.pyplot as plt
import sklearn.datasets as ds
import matplotlib.colors
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScalerdef expand(a, b):d = (b - a) * 0.1return a-d, b+dif __name__ == "__main__":N = 1000#1000个点centers = [[1, 2], [-1, -1], [1, -1], [-1, 1]]#人为给出聚类的中心点data, y = ds.make_blobs(N, n_features=2, centers=centers, cluster_std=[0.5, 0.25, 0.7, 0.5], random_state=0)#y为类别号data = StandardScaler().fit_transform(data)#归一化(把数据进行相对应的缩放),常见的有最大值最小值归一化、方差归一化、均值归一化# 数据的参数:(epsilon, min_sample)params = ((0.2, 5), (0.2, 10), (0.2, 15), (0.3, 5), (0.3, 10), (0.3, 15))matplotlib.rcParams['font.sans-serif'] = [u'SimHei']matplotlib.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(12, 8), facecolor='w')plt.suptitle(u'DBSCAN聚类', fontsize=20)for i in range(6):eps, min_samples = params[i]model = DBSCAN(eps=eps, min_samples=min_samples)model.fit(data)y_hat = model.labels_core_indices = np.zeros_like(y_hat, dtype=bool)core_indices[model.core_sample_indices_] = Truey_unique = np.unique(y_hat)n_clusters = y_unique.size - (1 if -1 in y_hat else 0)print(y_unique, '聚类簇的个数为:', n_clusters)plt.subplot(2, 3, i+1)clrs = plt.cm.Spectral(np.linspace(0, 0.8, y_unique.size))print(clrs)for k, clr in zip(y_unique, clrs):cur = (y_hat == k)if k == -1:plt.scatter(data[cur, 0], data[cur, 1], s=20, c='k')continueplt.scatter(data[cur, 0], data[cur, 1], s=30, c=clr, edgecolors='k')plt.scatter(data[cur & core_indices][:, 0], data[cur & core_indices][:, 1], s=60, c=clr, marker='o', edgecolors='k')x1_min, x2_min = np.min(data, axis=0)x1_max, x2_max = np.max(data, axis=0)x1_min, x1_max = expand(x1_min, x1_max)x2_min, x2_max = expand(x2_min, x2_max)plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)plt.title(u'epsilon = %.1f  m = %d,聚类数目:%d' % (eps, min_samples, n_clusters), fontsize=16)plt.tight_layout()plt.subplots_adjust(top=0.9)plt.show()

在这里插入图片描述

十三、谱和谱聚类

谱,通俗一点就是换个角度进行观察数据样本,例如从时域角度进行分析,其实就是多个正弦函数构成,这就相当于谱。
在这里插入图片描述

Ⅰ,谱

谱:Y=A*X,矩阵X乘以A等于对矩阵X做了空间线性变换,那么Y=map(X),A就是map这个线性算
子,它的所有特征值的全体,称之为方阵的谱
方阵的谱半径为最大的特征值

Ⅱ,谱聚类

谱聚类是一种基于图论的聚类方法,通过对样本数据的拉普拉斯矩阵的特征向量进行聚类,从而达到对样本数据进行聚类的目的

解决区域重叠问题,密度聚类对应区域重叠问题不太好办
有一堆个样本,可以构建成全连接图,并且两两样本之间总是可以去求相似度的
两两样本之间构建邻接矩阵来表示图
在这里插入图片描述
邻接矩阵上面的值,是用高斯相似度计算得来
然后对角线都是0,可以根据高斯相似度看出来,这样有了矩阵W
除了对角线都有相似度的值,然后把它们按行或列加和得对角阵D
在这里插入图片描述
在这里插入图片描述
L=D-W,这样的L矩阵叫做Laplace矩阵
L矩阵是NN的,N是样本个数,实数形成的对数矩阵,求特征值和特征向量
L
ui = lambda i*ui,lambda是特征值,ui是特征向量,一组lambda有从大到小可以排序
每个对应的lambda都对应一个ui,每个ui是一个个的列向量,比如u11,u21,u31,un1

根据排序默认从小到大,逆序之后我们就取前面的几个ui列向量就可以了,其实这是一种降维
然后,前面的这几个列向量ui就成了新的对应每个样本的几个重要的特征!
最后,用K-Means聚类算法对样本进行聚类即可
在这里插入图片描述

代码实现

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
from sklearn.cluster import spectral_clustering
from sklearn.metrics import euclidean_distancesdef expand(a, b):d = (b - a) * 0.1return a-d, b+dif __name__ == "__main__":matplotlib.rcParams['font.sans-serif'] = [u'SimHei']matplotlib.rcParams['axes.unicode_minus'] = Falset = np.arange(0, 2*np.pi, 0.1)data1 = np.vstack((np.cos(t), np.sin(t))).Tdata2 = np.vstack((2*np.cos(t), 2*np.sin(t))).Tdata3 = np.vstack((3*np.cos(t), 3*np.sin(t))).Tdata = np.vstack((data1, data2, data3))n_clusters = 3m = euclidean_distances(data, squared=True)sigma = np.median(m)plt.figure(figsize=(12, 8), facecolor='w')plt.suptitle(u'谱聚类', fontsize=20)clrs = plt.cm.Spectral(np.linspace(0, 0.8, n_clusters))for i, s in enumerate(np.logspace(-2, 0, 6)):print(s)af = np.exp(-m ** 2 / (s ** 2)) + 1e-6y_hat = spectral_clustering(af, n_clusters=n_clusters, assign_labels='kmeans', random_state=1)plt.subplot(2, 3, i+1)for k, clr in enumerate(clrs):cur = (y_hat == k)plt.scatter(data[cur, 0], data[cur, 1], s=40, c=clr, edgecolors='k')x1_min, x2_min = np.min(data, axis=0)x1_max, x2_max = np.max(data, axis=0)x1_min, x1_max = expand(x1_min, x1_max)x2_min, x2_max = expand(x2_min, x2_max)plt.xlim((x1_min, x1_max))plt.ylim((x2_min, x2_max))plt.grid(True)plt.title(u'sigma = %.2f' % s, fontsize=16)plt.tight_layout()plt.subplots_adjust(top=0.9)plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pl/sql中的赋值运算符_如何在SQL中使用AND / OR运算符?

pl/sql中的赋值运算符Basically, AND / OR operator is used to retrieving the record from the database. If we give more than one conditions by using AND Operator, then it retrieves the data from the database when both the conditions are true. And if we use OR…

【C++grammar】名字隐藏与重定义

目录1、继承中的名字隐藏1.基类同名函数被隐藏的现象描述2.问题理解3.避免现象2、重定义1.现象描述2.重定义与重载的区别3.能否使用 using 将基类成员引入到派生类定义中1、继承中的名字隐藏 1.基类同名函数被隐藏的现象描述 在学习变量作用域的时候知道,全局变量…

十四、聚类实战——图片压缩

对同一像素点值的像素点归为一类,通过平均值进行取代,从而将图像进行压缩并且保证图像尽可能不失真,关键信息仍保留。 from PIL import Image import numpy as np from sklearn.cluster import KMeans import matplotlib import matplotlib.…

步骤菜单使用css3实现

代码库:http://thecodeplayer.com/walkthrough/css3-breadcrumb-navigation 有兴趣的可以看一下,看完绝对让你大饱眼福。首先截图,看效果看着很酷吧,其实实现起来也不是很难,里边需要用的技术有:box-shadow,计数器&…

【嵌入式系统】STM32串口通信的四种方法(基于RTOS)

目录1、串行通信的基本参数2、轮询方式代码效果3、中断方式代码效果4、中断加上时间戳方式代码及效果5、DMA空闲中断方式接收数据1、串行通信的基本参数 串行端口的通信方式是将字节拆分成一个接一个的位再传输出去,接收方再将此一个一个的位组合成原来的字符&…

十五、聚类的评估

一、Given Label 均一性homogeneity:一个簇中只包含一个类别样本,Precision 完整性completeness:同类别样本被归到同一个簇中,Recall 将均一性h和完整性c进行结合(二者加权平均)得到V-Measure,,β为权重 …

SQL SERVER作业的Schedules浅析

SQL SERVER作业的计划(Schedules),如果你没仔细研究过或没有应用一些复杂的计划(Schedules),那么你觉得SQL SERVER作业的计划(Schedules)非常好用,也没啥问题,但是我要告诉你一个“残…

leetcode 51. N 皇后 思考分析

目录题目思考AC代码题目 n 皇后问题研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 思考 首先以N4为例,画出解空间树的一部分: 根据模板: void backtracking(参数) {if(终止条件){存放结果…

No module named ‘tensorflow.examples‘解决方案

想从tensorflow中导入mnist手写数字数据集,结果报错 from tensorflow.examples.tutorials.mnist import input_data import tensorflow.compat.v1 as tf tf.disable_v2_behavior()my_mnist input_data.read_data_sets("MNIST_data_bak/", one_hotTrue)&…

.NET通用基本权限系统

DEMO下载地址: http://download.csdn.net/detail/shecixiong/5372895 一、开发技术:B/S(.NET C# ) 1、Windows XP以上 (支援最新Win 8) 2、Microsoft Visual Studio 2010/2012 C#.NET 3、.NET Framework 4.0以上 (支援最新4.5版本) 4、SQL Server 2005以…

leetcode 37. 解数独 思考分析

目录题目核心思路的不断细化1、核心框架2、考虑到每个位置的工作3、考虑到到达最后一列、该位置的数已经预置的情况4、判断是否符合规则的函数5、确定递归终止条件确定函数返回值AC代码题目 编写一个程序,通过填充空格来解决数独问题。 一个数独的解法需遵循如下规…

快速完成兼职外包开发任务

做了很多年的开发相关的工作,做过兼职开发,也做过外包一些开发项目。 兼职人员角色时 正是经历这些事情时,每次就要提前很费经的跟公司沟通,让他们把公司内部的svn开发出去,但是就是很难,会涉及到安全各方的…

使用YOLOv5训练NEU-DET数据集

一、下载YOLOv5源码和NEU-DET(钢材表面缺陷)数据集 YOLOv5源码 NEU-DET(钢材表面缺陷)数据集 这里的数据集已经经过处理了,下载即可 若通过其他途径下载的原始数据集标签为xml格式,需要转化为txt格式XML转txt格式脚本 二、数据集准备 NEU-DET(钢材表…

带分页功能的SSH整合,DAO层经典封装

任何一个封装讲究的是,使用,多状态。Action:任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数。并根据这个参数进行查值。然后在继承ServiceManage,Service…

leetcode 198. 打家劫舍 思考分析

目录1、题目2、求解思路3、代码1、题目 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动…

找不到Windows照片查看器解决方法

桌面创建一个txt文本 复制这些命令,之后将后缀改为.reg,右击管理员身份运行即可 Windows Registry Editor Version 5.00 ; Change Extensions File Type [HKEY_CURRENT_USER\Software\Classes\.jpg] "PhotoViewer.FileAssoc.Tiff" ; Change E…

伙伴分配器的一个极简实现

提起buddy system相信很多人不会陌生,它是一种经典的内存分配算法,大名鼎鼎的Linux底层的内存管理用的就是它。这里不探讨内核这么复杂实现,而仅仅是将该算法抽象提取出来,同时给出一份及其简洁的源码实现,以便定制扩展…

[USACO3.2.3 Spinning Wheels]

[关键字]:模拟 枚举 [题目大意]:有5个轮子,每个轮子优r个缺口并且会按一定速度不停转动,问什么时候可以使一条光线射过所有轮子。 // [分析]:从0到1000(或其他的)枚举分钟然后判断,当…

一、SQLServer2008安装(带密码)、创建数据库、C#窗体项目测试

一、下载和安装SQLServer2008 东西太大了,没法上传到资源里面,官网其他公众号都下载可以。 右击管理员身份 运行setup.exe 这个密钥不能用的话,也可以去百度其他密钥 JD8Y6-HQG69-P9H84-XDTPG-34MBB 建议改一下路径,我这边修…

【C++grammar】多态、联编、虚函数

目录1、多态概念1.多态性有两种表现的方式2、联编(实现多态)1.静态联编2.动态联编3、实现运行时多态1.为何要使用运行时多态?2.如何实现运行时多态3.多态的例子1.调用哪个同名虚函数?2. 用途:可以用父类指针访问子类对…