/**
* 产生范围在[start,end]区间的配对的序列, 填充到int[arrayRows>0][arrayCloums>0]的数组中,
* 最后返回这个数组
* 完美版,适用于任何情况
*
* @param start
* 起始整数
* @param end
* 终点整数
* @param arrayRows
* 数组行数
* @param arrayColums
* 数组列数
* @return 如果参数中数组行列值小于等于零或者数组大小为奇数,则返回null,否则
* 返回已经填充了配对数的数组int[arrayRows][arrayCloums]
*/
public static int[][] partnerUP(int start, int end, int arrayRows,
int arrayColums) {
if (arrayColums <= 0 || arrayRows <= 0
|| (arrayColums * arrayRows) % 2 != 0) {
return null;
}
int[] eCount;// 元素计数器
int[] lastAddr;// 元素最后出现的地址
int[][] data = new int[arrayRows][arrayColums];// 保存配对序列数组
int arraySize = arrayRows * arrayColums;// 数组大小
int maxPartners = arraySize / 2;// 数组中可能出现的最大对数
// 将start恒置为小的数,end为大的数
if (end - start < 0) {
int tmp = end;
end = start;
start = tmp;
}
// 填充范围,大于0
int fillArea = Math.abs(end - start) + 1;
// 填充范围是否大于最大配对数,如果是的,则只需maxPartens个填充因子就可以了
boolean isOverPartner=(fillArea - maxPartners)>0? true:false;
int[]fillElemts=new int[0];
if (isOverPartner) {
//定义maxPartners个格子用来装随机从fillArea中取出的填充因子
fillElemts=new int[maxPartners];
for(int i=0;i<fillElemts.length;i++){
fillElemts[i]=start+(int)(Math.random()*fillArea);
}
//数组地址范围,计数器、最后地址数组地址范围
fillArea=maxPartners;
eCount = new int[fillArea];
lastAddr = new int[fillArea];
}else{
eCount = new int[fillArea];
lastAddr = new int[fillArea];
}
// 填充data[][]
for (int i = 0; i < arraySize; i++) {
// 随机产生一张图片索引
int index = start + (int) (Math.random() * fillArea);
// 对应索引计数+1
eCount[index - start] += 1;
if(isOverPartner){
//选取抽取出来的元素
data[i / arrayColums][i % arrayColums]=fillElemts[index-start];
}else{
// 将图片名称放入Data中
data[i / arrayColums][i % arrayColums] = index;
}
// 将最后出现的地址赋给addrCount[index]保存
lastAddr[index - start] = i;
}
// 图素配对开始(去单操作)
// 从计数数组的最有一个元素开始
int i = eCount.length - 1;
// 出现的元素中数量为奇数的元素个数
int pCount = 0;
while (i > -1) {
if (eCount[i--] % 2 == 1) {
pCount += 1;
}
}
// 如果确实存在奇数个元素
while (pCount > 0) {
for (int j = 0; j < eCount.length - 1; j++) {
for (int k = 1; k < eCount.length; k++) {
if (eCount[j] % 2 == 1) {
if (eCount[k] % 2 == 1) {
// 计数器为奇数的图素地址交换(根据最后图素保存的地址进行交换操作)
data[lastAddr[j] / arrayColums][lastAddr[j]
% arrayColums] = data[lastAddr[k]
/ arrayColums][lastAddr[k] % arrayColums];
eCount[j] -= 1;
eCount[k] += 1;
pCount -= 2;//去掉两个奇数素
}
}
}
}
}// 图素配对结束
return data;
}
|
相关推荐
在这个项目中,“基于自然语言处理的NL2SQL语句生成算法.zip”提供了一个数据集和源代码,旨在帮助算法工程师在NL2SQL这一方向上进行实践和学习。 首先,NL2SQL(Natural Language to SQL)是一种技术,它允许用户...
在C语言中,图算法的实现需要注意数据结构的设计,内存的分配与回收,以及递归和循环等控制流程的优化。C语言为程序员提供了很大的自由度去优化算法性能,但同时也要求程序员有良好的编程习惯和调试技巧。 具体实现...
- **实现**: 从一个顶点出发,每次选择与已选顶点相连且未被选择的边中权重最小的边加入生成树中,直到包含所有顶点。 **13. 次小生成树O(V^2)** - **定义**: 寻找次优解的最小生成树。 - **实现**: 在Prim算法的...
6. 生物信息学:基因序列分析中的配对问题可以转化为图论问题,寻找最优配对方式。 7. 人工智能:游戏AI中的路径规划,机器人自主导航等问题也离不开图论算法。 综上所述,图论算法在解决复杂问题时起着关键作用,...
接着,混沌序列生成器产生一个高强度的随机密钥;然后,这些二进制数据被按照DNA编码规则转换为DNA序列;最后,加密和解密过程中会应用各种变换,以确保数据的安全性。在MATLAB环境下,用户可以方便地调整参数,观察...
《图论算法及其MATLAB实现》是一本深入探讨图论算法与其实现的书籍,尤其强调了使用MATLAB这一强大的科学计算工具进行编程实践。图论是计算机科学和数学的一个重要分支,它研究的是点(节点)和点之间的连接线(边)...
- 加密:使用DNA序列与图像数据进行操作(如XOR),生成加密图像。 - 存储或传输:加密后的图像数据可以安全地存储或传输。 - 解密:接收方使用相同的DNA密钥进行解密操作,还原二进制序列,再转回原始图像。 这...
4. 交叉:交叉(也称配对或杂交)是生成新个体的主要方式,它通过组合两个父代的部分特征来生成子代。最常用的交叉策略是单点交叉、多点交叉和均匀交叉。在C++中,可以实现相应的函数来执行交叉操作。 5. 变异:...
4. 配对与交叉:选择的个体进行配对,并进行交叉操作,也就是交换两个个体的部分路径,生成新的后代。交叉操作可以采用单点交叉、多点交叉或均匀交叉等方式。 5. 变异操作:对新生成的后代进行变异操作,随机改变...
论文的实验部分对比了所提出的优化方法与传统方法生成的DNA序列在综合适应度函数上的性能。实验结果表明,改进的粒子群遗传算法能有效找到满足多约束条件的高质量DNA编码序列,从而提高了DNA计算的稳定性和效率。 ...
该软件实现了讨论的动态编程算法,以计算氨基酸和框内核苷酸 CDR3 序列的生成概率。 由于自适应库的研究人员需要掌握全部技术编码技能,因此本README和软件的目标是,对于具有任何编程背景的研究人员都应尽可能地...
《MATLAB统计分析与应用:40个案例分析》是一本深入探讨MATLAB在统计分析领域的专著。这本书通过40个具体的案例,系统地介绍了如何利用MATLAB进行各种统计分析,涵盖了从基础到高级的各种统计方法。源程序和数据是这...
- **最佳、最坏与平均情况分析:** 分析算法在不同情况下的表现。 - **均摊分析:** 当一系列操作的总成本较低,但个别操作的成本较高时,通过均摊分析可以得出更合理的结论。 #### 线性表 - **线性表及抽象数据...
然后,通过特定的编码规则(如 Watson-Crick配对),对DNA序列进行编码和解码,实现数据的加密和解密。 这种图像DNA加密算法的优势在于其对初始条件的高度敏感性,使得攻击者几乎不可能通过逆向工程恢复原始图像。...