`
天之娇子zjn
  • 浏览: 16041 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

排重算法的实现

阅读更多

       如果给定一个int型数组,要求输出其中重复的数字,应该大多数人都能够实现。但是如果数组内数据很多,假设有10亿个,那直接在该数组上进行操作时间复杂度O(n*n)就会变得很大。所以可以通过对byte数组进行操作来降低时间复杂度,步骤分为以下几步:

1、将int型数组内的数据通过恰当的变换赋值给byte数组:int[i]/8为byte数组的下标,int[i]%8的累加赋值给byte【int[i]/8】;

2、对byte数组进行循环判断:如果byte【int[i]/8】为0,说明byte【int[i]/8】中还未赋值,进入赋值步骤,将byte【int[i]/8】转换成8位二进制;否则进入byte【int[i]/8】二进制和int[i]%8二进制的比较,匹配1则输出,否则对其赋值。

/**
	 * 排重的方法
	 */
	public void Repitation_exlusion(int[] in,int n){
		int[] a = {1,2,4,8,16,32,64};
		char c = '0';
		//byte型数组
		byte[] bytes = new byte[125];
		//byte型数组转换成二进制字符串
		String[] s1 = new String[125];
		//c1用来存放对应byte数组8位二进制字符串
		char[][] c1 = new char[125][8];
		
		//排重
		for(int i=0;i<n;i++){
			//如果byte数组某一项未出现过则为其赋值
			if(c1[in[i]/8]==null){
				switch (in[i]%8) {
				case 0:
					bytes[in[i]/8]+=(byte)a[0];
					break;
				case 1:
					bytes[in[i]/8]+=(byte)a[1];
					break;
				case 2:
					bytes[in[i]/8]+=(byte)a[2];
					break;
				case 3:
					bytes[in[i]/8]+=(byte)a[3];
					break;
				case 4:
					bytes[in[i]/8]+=(byte)a[4];
					break;
				case 5:
					bytes[in[i]/8]+=(byte)a[5];
					break;
				case 6:
					bytes[in[i]/8]+=(byte)a[6];
					break;
				case 7:
					c = '1';
					break;
				default:
					break;
				}
			s1[in[i]/8] = ToBinary8(bytes[in[i]/8]);
			s1[in[i]/8].getChars(1,8,c1[in[i]/8],1);
			c1[in[i]/8][0] = c;
			c='0';
			}
			//byte数组中某一项出现了则进行判断
			else {
				if(c1[in[i]/8][7-in[i]%8]=='1')
					System.out.println(in[i]+"重复出现");
				else{
					if(in[i]%8!=7){
						bytes[in[i]/8]+=(byte)a[in[i]%8];
					}
					else {
						c1[in[i]/8][0]='1';
					}
					s1[in[i]/8] = ToBinary8(bytes[in[i]/8]);
					s1[in[i]/8].getChars(1,8,c1[in[i]/8],1);
				}
			}
			}
			
	}

 

/**
	 * 二进制字符串左补0的方法,将字符串转换成8位二进制数
	 * @param value
	 */
	public  String ToBinary8(int value){
		char[] chars = new char[8];
		value = value & 0xFF;
		for(int i=7;i>=0;i--){
			chars[i] = (value%2==1)?'1':'0';
			value/=2;
		}
		return new String(chars);
		
	}

          遇到的问题:将128赋给byte数组时,发生了越界的情况,因为byte范围是-128~127,所以另外指定一个字符存储。

 改进的代码:

public class RepitationE {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		RepitationE re = new RepitationE();
		//存放整型数据的int型数组
		 int[]in={233,56,789,213,6,0,9,871,11,22,56,33,12,11,78,90,999,88,111,345,90,233,122,4,66,
				667,33,32,54,47,2};
		re.Repitation_exlusion(in,31);
	}
	
	/**
	 * 排重的方法
	 */
	public void Repitation_exlusion(int[] in,int n){
		//byte型数组,行数为整除数,列数为余数
		byte[][] bytes = new byte[125][8];	
		//排重
		for(int i=0;i<n;i++){
			//如果byte数组某一项未出现过则为其赋值
			if(bytes[in[i]/8]==null){
				bytes[in[i]/8][in[i]%8]=1;
			}
			//byte数组中某一项出现了则进行判断
			else {
				if(bytes[in[i]/8][in[i]%8]==1)
					System.out.println(in[i]+"重复出现");
				else{
					bytes[in[i]/8][in[i]%8]=1;
				}
			}
			}
			
	}
}

 

        这样一来不仅免去了创建多个类型数组的麻烦,同时省去了将byte数组内先赋值后转换成二进制的麻烦,代码也简便了很多。

分享到:
评论

相关推荐

    生产线自动排产算法

    在生产管理领域,生产线自动排产算法是...总的来说,生产线自动排产算法是制造业数字化转型的关键技术之一,它通过科学的方法论和计算手段,实现了生产过程的智能化和高效化,有助于企业在激烈的市场竞争中提升竞争力。

    山东大学 大数据实验二 倒排索引算法Java实现

    基于hadoop集群系统(也可以在伪分布式系统上运行)系统使用Java编写的倒排索引实现,具有使用停词表功能,使用正则表达式选择规范的单词。代码重构了setup(),map(),combiner(),partitation()和reducer()函数,...

    实验1-1倒排记录表的合并算法实现

    信息检索,倒排记录表的合并算法实现,用户通过提示输入两个倒排记录表,系统自动实现倒排记录表的合并,并将合并结果输出。

    纹织CAD中图案智能排布算法的实现.pdf

    纹织CAD系统通过先进的建模分析技术,帮助设计师在限定区域内高效地进行纹织物花型图案的排布设计,而图案智能排布算法的实现,进一步提升了该系统的智能化水平和设计效率,为纺织品的创新设计提供了强大的技术支持...

    网页排重算法-信息指纹算法.doc

    1. **信息指纹算法实现流程**: - 预处理网页内容,去除噪声数据(如广告、导航栏等非正文信息)。 - 对预处理后的网页进行分词,统计词频,并生成词频列表。 - 选择列表中的前N个关键词作为信息指纹的初始组成...

    高级排产计划中启发式算法研究与实现

    在深入探讨“高级排产计划(Advanced Planning and Scheduling,简称APS)中启发式算法的研究与实现”这一主题之前,我们首先需要理解APS系统的基本概念及其在现代制造业中的重要性。APS是一种高度复杂的生产调度...

    c++实现倒排索引算法

    在C++中实现倒排索引算法可以帮助我们理解其原理并优化搜索性能。以下是对倒排索引算法及其C++实现的详细解释。 一、倒排索引的概念 倒排索引(Inverted Index)与传统的正向索引相反。在正向索引中,每个关键词...

    快排算法c语言实现

    这个是之前学习快排编的,里面包含了生成随机数的代码,仅供参考!

    基于遗传算法的排产算法测试,使用CXF

    - **服务发布**:将遗传算法实现封装为Web服务,通过XML描述(WSDL)暴露服务接口。 - **服务消费**:客户端通过CXF的客户端API调用服务,获取优化后的排产计划。 这种结合方式具有以下优点: - **可复用性**:...

    枚举归并快排并行算法实现

    枚举排序、快速排序、归并排序的串行算法及对应的简单并行算法,java实现,可自由选择线程数。代码仅供参考。

    APS(高级生产排程)算法

    APS,全称Advanced ...企业可以根据自身需求和问题特点,选择合适的算法或组合使用,以实现更高效、更灵活的生产管理。同时,随着计算能力的增强和算法的不断演进,APS系统将更加智能,为企业提供更强大的决策支持。

    几个算法的实现和算法作业

    在本压缩包中,我们可以看到一个名为"几个算法实现"的文件,这通常包含了一些常见的算法设计和实现,使用C++编程语言编写,并且带有注释。这些算法是计算机科学和信息技术领域的基础,对于理解和解决各种计算问题至...

    启发式算法在生产排产中的应用

    在生产排产领域,单件生产的车间生产作业计划排产问题一直是一个研究热点和难点。...未来,随着算法的不断优化和生产技术的进步,启发式算法在生产排产领域的应用将会更加广泛,并有望解决更多实际生产中的问题。

    广州大学 数据结构实验报告 实验四 查找和排序算法实现

    实验报告的主题聚焦于数据结构中的查找和排序算法实现,这是计算机科学中基础且重要的部分,尤其是在处理大量数据时。以下是对这些算法的详细说明: 1. **插入排序**:插入排序的基本思想是将一个记录插入到已经排...

    快速排序算法的简单实现

    快排算法的简单实现。 快速排序是实际运用中用的最多的算法,虽然它在最坏的情况下会达到n^2,但它的平均性能非常好,期望时间复杂度为nlgn,而且隐含的常数因子非常小,并且是原址排序。 快速排序原理:从一组数...

    甘特图任务排程的算法

    甘特图任务排程的算法是一个复杂的算法,需要正确地实现每个步骤,以便于正确地获得关键路径。 在实际应用中,甘特图任务排程的算法可以应用于项目管理、生产计划、 Supply Chain Management 等领域,可以帮助企业...

    柔性生产线排产算法研究与系统实现_毕业论文.pdf

    柔性生产线排产算法研究与系统实现 柔性生产线排产算法研究与系统实现是当前制造业的核心问题之一。该研究主要集中在柔性生产线排产算法的研究和应用上,以提高飞机零部件的制造效率和响应速度。该论文的主要研究...

    pb实现的排刀的遗传算法(仿照求最短路径)

    【遗传算法实现排刀优化】 遗传算法是一种模拟自然选择和遗传机制的全局优化技术,源自生物进化论。在本文中,我们将深入探讨如何利用遗传算法解决特定问题——排刀算法,这是一种在制造工艺中优化刀具顺序的问题。...

    python实现的改进的遗传算法解决工件生产安排

    自己写的改进遗传算法的python程序。

Global site tag (gtag.js) - Google Analytics