`

配对序列生成算法实现与分析

阅读更多

配对算法实现与分析

这个也是做连连看时所写的算法,为了保持通用原则,这里一律采用数组实现

基本思路:

1.       先将所有元素填充到数组里,并把出现次数放到eCount[]里、最后出现的地址放到

lastAddr[]中。

2.       查看eCount[]此时数组里的各种元素出现的次数有双有单。

3.       找出两个eCount[x1],eCount[x2]为单的元素的lastAddr[x1]lastAddr[x2],并设置 data[lastAddr[x1]]=data[lastAddr[x2]]

4.       这就完成了双去单。

/**

     * 产生范围在[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;

    }

测试结果:

Xx代表方括号里的的数字

LLKTookit.partnerUP(x,x,4,4)

===========[1,15]

8,14,15,14,

10,8,2,1,

15,2,1,10,

14,8,14,8,

==============[-115]

-1,12,6,12,

3,6,6,6,

13,-1,6,15,

15,13,6,3,

==============[-1,-15]

-6,-5,-6,-6,

-9,-6,-6,-1,

-7,-9,-5,-7,

-15,-1,-6,-15,

=============[0,0]

0,0,0,0,

0,0,0,0,

0,0,0,0,

0,0,0,0,

=============[1,1]

1,1,1,1,

1,1,1,1,

1,1,1,1,

1,1,1,1,

==============[-1,-1]

-1,-1,-1,-1,

-1,-1,-1,-1,

-1,-1,-1,-1,

-1,-1,-1,-1,

分析:从代码上看,写得比较繁杂,从运行结果来看,该函数实现的还不错。

总结:这个方法的实现经历最初的内嵌版本,再是分离出来后的不完美版(有兴趣的可以看看,在下面),知道今天改的自认为完美版,一路走来都意味着一次次的进步,和对完美的追求,今天写的这个配对算法和之前写的连线算法一起,作为我暑假连连看游戏制作的最终收获,我觉得,虽然不丰厚,但至少很值得。

 

不完美版代码,在注释中有 “为什么不完美的解释”

以下是word文档

 

分享到:
评论

相关推荐

    Velvet短序列拼接新算法

    Velvet作为一种新型的短序列组装算法,通过对de Bruijn图的有效利用,不仅能够处理高覆盖度、短读段的数据,还能够生成高质量的组装结果。无论是对于原核生物还是哺乳动物的数据,Velvet都能表现出良好的组装性能。...

    数据结构与算法分析_Java语言描述(第2版)

    《数据结构与算法分析:Java语言描述(第2版)》是一本综合介绍了数据结构、算法设计与分析的教材,利用Java编程语言深入讲解了各种数据结构和算法的实现及其运行时间的分析,作者是Mark Allen Weiss。本书面向的...

    数据结构与算法分析

    书的内容包括表、栈、队列、树、散列表、优先队列、排序、不相交集算法、图论算法、算法分析、算法设计、摊还分析、查找树算法、k-d树和配对堆等。本书适合作为计算机相关专业本科生的数据结构课程和研究生算法分析...

    数据结构与算法分析第二版 ---C语言描述(附加答案)

    不相交集ADT8.1 等价关系8.2 动态等价性问题8.3 基本数据结构8.4 灵巧求并算法8.5 路径压缩8.6 按秩求并和路径压缩的最坏情形8.6.1 Union/Find算法分析8.7 一个应用总结练习参考文献第9章 图论算法9.1 若干定义9.1.1...

    基于自然语言处理的NL2SQL语句生成算法.zip

    在这个项目中,“基于自然语言处理的NL2SQL语句生成算法.zip”提供了一个数据集和源代码,旨在帮助算法工程师在NL2SQL这一方向上进行实践和学习。 首先,NL2SQL(Natural Language to SQL)是一种技术,它允许用户...

    数据结构与算法分析Java语言描述(第二版)

    算法分析2.1 数学基础2.2 模型2.3 要分析的问题2.4 运行时间计算2.4.1 一个简单的例子2.4.2 一般法则2.4.3 最大子序列和问题的求解2.4.4 运行时间中的对数2.4.5 检验你的分析2.4.6 分析结果的准确性小结练习参考文献...

    数据结构与算法分析_Java语言描述(第2版)]

    Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。随着计算机速度的不断增加和功能...

    算法:C语言实现 第二卷(第5部分) 图算法

    在C语言中,图算法的实现需要注意数据结构的设计,内存的分配与回收,以及递归和循环等控制流程的优化。C语言为程序员提供了很大的自由度去优化算法性能,但同时也要求程序员有良好的编程习惯和调试技巧。 具体实现...

    数据结构与算法分析C++描述

    《数据结构与算法分析C++描述》第3版是一本专注于数据结构和算法分析的经典教材,旨在通过C++这种主流的编程语言来阐述和实现各种数据结构和算法。书中涵盖了广泛的主题,从基础的数据结构到复杂的算法设计和分析...

    数据结构与算法分析java源代码

    《数据结构与算法分析》是计算机科学领域的一本经典著作,由Mark Allen Weiss撰写,主要讲解了各种数据结构和算法的实现与分析。这本书的Java源代码版本为读者提供了直观的编程实例,便于深入理解这些核心概念。以下...

    图论算法理论实现_图论及其_图论算法_图论_图论知识_

    6. 生物信息学:基因序列分析中的配对问题可以转化为图论问题,寻找最优配对方式。 7. 人工智能:游戏AI中的路径规划,机器人自主导航等问题也离不开图论算法。 综上所述,图论算法在解决复杂问题时起着关键作用,...

    基于Logistic混沌序列和DNA编码的图像加解密算法仿真,matlab2021a测试。

    接着,混沌序列生成器产生一个高强度的随机密钥;然后,这些二进制数据被按照DNA编码规则转换为DNA序列;最后,加密和解密过程中会应用各种变换,以确保数据的安全性。在MATLAB环境下,用户可以方便地调整参数,观察...

    图论算法及其MATLAB实现(完整版)

    《图论算法及其MATLAB实现》是一本深入探讨图论算法与其实现的书籍,尤其强调了使用MATLAB这一强大的科学计算工具进行编程实践。图论是计算机科学和数学的一个重要分支,它研究的是点(节点)和点之间的连接线(边)...

    数据结构与算法分析 Java语言描述第2版

    内容简介《数据结构与算法分析:Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。...

Global site tag (gtag.js) - Google Analytics