`

0830--算法练习题

阅读更多

1. 内存中有一个长数组,条目数为10万,数组单元为结构体struct array,sizeof(struct array)为512字节。结构有一int型成员变量weight。现需要取得按weight值从大到小排序的前500个数组单元,请实现算法,要求效率尽可能高。

 

package org.jyjiao.test1;

//Struct 元素类
class Struct{
	private int weight;
	
	public int getWeight() {
		return weight;
	}
	
	public void setWeight(int weight) {
		this.weight = weight;
	}
	
}

//堆操作
class Heap{
	Struct[] items;
	int itemsLen;    //堆大小
	int lastIndex;   //最后一个元素的下标
	
	public Heap(Struct[] items){
		this.items=items;
		this.itemsLen=items.length;
		this.lastIndex=this.itemsLen-1;
	}
	
	//创建最大堆
	public void createHeap(){
		if(itemsLen>0){
			for(int i=itemsLen/2-1;i>=0;i--){
				siftDown(i);                              //注意参数
			}
		}else{
			System.out.println("array is null");
		}
	}
	
	//取得堆顶元素,并重新调整堆
	public Struct getMax(){
		Struct ret=items[0];
		items[0]=items[lastIndex];
		lastIndex--;
		siftDown(0);
		return ret;
	}
	
	//向下筛
	void siftDown(int i){                                //核心算法
		int childIndex;
		while((2*i+1)<=lastIndex ){
			childIndex=2*i+1;
			if((2*i+2)<=lastIndex && items[2*i+1].getWeight()<items[2*i+2].getWeight()){
				childIndex=2*i+2;
			}
			if(items[i].getWeight()<items[childIndex].getWeight()){
				Struct tmp=items[i];
				items[i]=items[childIndex];
				items[childIndex]=tmp;
				i=childIndex;
			}else{
				break;
			}
		}//while
	}
	
}

//测试代码
public class Max500 {
	public static void main(String[] args){
		Struct[] array=new Struct[10];
		for(int i=0;i<10;i++){
			array[i]=new Struct();                                      //本句不能缺少,必须初始化数组对象!
			array[i].setWeight((int)(Math.random()*50));  //注意用set,不要用赋值语句
			System.out.print(array[i].getWeight()+"  ");
		}
		System.out.println("\n");
		Heap heap=new Heap(array);
		heap.createHeap();
		for(int i=0;i<5;i++){
			Struct tmp=heap.getMax();
			System.out.print(tmp.getWeight()+"  ");
		}
	}
	
}

 

 算法效率: O(n)

 

 

2. 现有两个文件,

  a)数据文件A,格式为:关键词、IP地址、时间,记录条数为1000万左右,该文件是无序排列的。

  b)数据文件B是关键词ID到关键词的对应表文件,格式为:ID、关键词,记录条数在100万左右,也是无序排列的。该对应表中的记录是一一对应的,不存在ID或者关键词重复的情况。

  要求将数据文件A对应的关键词替换为B中的ID,生成新的数据文件C,数据文件C的格式为:关键词ID、IP地址、时间。

  请设计一个程序,实现上述功能,并分析时间复杂度和空间复杂度。运行程序所使用的服务器的内存为1G,硬盘足够大。(至少要给出关键算法和设计思路)

 

package org.jyjiao.test1;

import java.io.*;
import java.util.*;

public class ReplaceKeyWord {
	String fileA, fileB, fileC;
	HashMap<String,Integer> map;
	public ReplaceKeyWord(String fileA, String fileB, String fileC) {
		this.fileA = fileA;
		this.fileB = fileB;
		this.fileC = fileC;
		map = new HashMap<String,Integer>();
	}

	public void replace() {
		try {
			BufferedReader brA = new BufferedReader(new FileReader(fileA));
			BufferedReader brB = new BufferedReader(new FileReader(fileB));
			BufferedWriter bwC = new BufferedWriter(new FileWriter(fileC));
			// iniciate hashmap (时间复杂度:O(1M),空间复杂度:O(1M))
			String str;
			while ((str = brB.readLine()) != null) {
				str.trim();
				String[] tmpB = new String[2];
				tmpB = str.split("、");
				map.put(tmpB[1],new Integer(tmpB[0]));
			}
			
			// input fileC (时间复杂度:O(10M), 空间复杂度:O(1))
			while ((str = brA.readLine()) != null) {
				str.trim();
				String[] tmpA=str.split("、");
				
				String key=tmpA[0];
				if(map.containsKey(key)){
					Integer id=map.get(key);
					str=id+"、"+tmpA[1]+"、"+tmpA[2];
					bwC.write(str);
					bwC.newLine();
				}
			}
			
			brA.close();
			brB.close();
			bwC.flush();
			bwC.close();
			
		} catch (IOException ex) {
			ex.printStackTrace();
		} finally {

		}
	}

	public static void main(String[] args) {
		String fileA="D:\\fileA.txt";
		String fileB="D:\\fileB.txt";
		String fileC="D:\\fileC.txt";
		ReplaceKeyWord rk=new ReplaceKeyWord(fileA,fileB,fileC);
		rk.replace();
	}

}

 时间复杂度:O(len(fileA)) ,  空间复杂度:O(len(fileB))

 

 

3. 对一个数组S,求其中满足要求的最大元素C。要求C满足等式C=A*B,其中AB也是数组S中的元素。请用能想到的最优算法,分析时间和空间复杂度。(用语言描述算法,不用写程序)
注:这个题我当时做的方法在时间上要用o(n^3),事后想出了个o(n^2 logn)的方法。不知有没有更好的方法。

 

 

package org.jyjiao.test1;
import java.util.*;
public class MaxProduct {
	public static void main(String[] args){
		int[] S={2,3,6,18,36,216,12,108};
		int C=0;;
		HashSet<Integer> set=new HashSet<Integer>();
		for(int i=0;i<S.length;i++){
			set.add(new Integer(S[i]));
		}
		for(int i=0;i<S.length;i++){
			for(int j=i+1;j<S.length;j++){
				int tmp=S[i]*S[j];
				if(set.contains(new Integer(tmp))){
					if(tmp>C){
						C=tmp;
					}
				}
			}
		}
		System.out.println("max product is:"+C);
	}

}

 

 

 

5. 一个整数数列,元素取值可能是1-N(N是较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的的数对的个数,满足数对中两个数的和等于N+1。

复杂度最好是O(n)

 

 

6.有个整数数列,如何求绝对数和最大的连续字符串,

 

 

 

分享到:
评论

相关推荐

    PTA-数据结构与算法题目集.zip

    PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 ...

    k-means算法实例

    **K-means算法详解** K-means是一种广泛应用的无监督学习方法,主要用于数据的聚类分析。它通过迭代过程将数据点分配到预定义数量(K)的类别中,目标是使得同一类别内的数据点相互接近,不同类别之间的数据点尽...

    Python-100daysofalgorithms算法100天的练习题

    《Python-100daysofalgorithms算法100天的练习题》是针对Python编程者设计的一个进阶学习项目,旨在通过100天的持续训练,提升开发者在算法和设计模式方面的技能。这个练习计划涵盖了从基础到高级的各种算法,旨在...

    算法导论习题答案---关于算法习题的答案

    本压缩包文件“习题答案”提供了《算法导论》中的所有习题解答,这对于正在学习此书或者准备相关考试的学生来说是极其宝贵的资源。通过参考这些答案,你可以检验自己的解题思路是否正确,理解各种算法的精髓,并且...

    数据挖掘聚类算法--k均值算法

    K均值算法(K-Means)是一种广泛应用的迭代式聚类算法,适用于处理数值型数据。下面将详细阐述K均值算法的核心原理、步骤、优缺点以及其在数据挖掘中的应用。 K均值算法的基本思想是通过迭代过程将数据点分配到最近...

    NOIP普及组 提高组 CSP-J CSP-S初赛 算法的时间复杂度部分题目(2023.09.15)C.pdf

    在计算机科学中,算法的时间复杂度是对算法运行时间的一个度量,它反映了问题规模n增长时,算法执行步骤的数量的增长趋势。本题集主要涉及了NOIP(全国青少年信息学奥林匹克竞赛)普及组和提高组的CSP-J(Junior)和...

    算法导论习题解答 4-4

    题目中的“4-4”可能指的是书中的第四章第四个习题,通常涉及图算法或者动态规划等主题。由于具体描述为空,我将根据一般情况对这类习题可能涉及的知识点进行详细阐述。 首先,第四章往往讨论图算法,如最短路径、...

    算法导论课后习题与思考题答案

    根据提供的文件信息,可以看出这是一本《算法导论》(第二版)的教师手册,由Thomas H....通过对这些习题的练习和思考,读者可以更深入地理解算法设计的核心概念和技术,为进一步学习高级算法奠定坚实的基础。

    蓝桥杯官网练习题和测评数据-算法提高1-84(共44题)

    蓝桥杯练习题概览 试题集名称 试题总数 更新时间 入门训练 4 2013/10/9 基础练习 30 2013/11/3 算法训练 180 2018-03-09 算法提高 220 2018-03-09 历届试题 55 2017-12-18 包括题目和测试数据

    计算机算法练习题

    计算机算法练习题 计算机专业的算法经典 一些常用的数据结构与算法练习 很受用的

    C++算法-图算法(第三版).rar

    同时,作者可能通过实例和练习题来帮助读者巩固所学知识,确保理论与实践相结合。 源代码部分可能包含每种图算法的C++实现,这对于初学者理解和调试算法至关重要。这些源代码能够帮助读者更好地理解算法的逻辑,并...

    算法导论22章课后习题答案

    最近在研习算法导论,发现课后习题的精彩程度甚至不亚于正文,对于算法导论的爱好者而言,这是一份不错的参考资料

    Algorithm Design (Kleinberg Tardos 2005) - Solutions 《算法设计》习题答案

    这本书深入浅出地介绍了算法设计的基本原理和方法,并配以丰富的习题来帮助读者巩固理解和应用所学知识。提供的压缩包文件包含了该书的习题答案,对于学习者来说是一份宝贵的参考资料。 算法设计是计算机科学和信息...

    算法导论及课后习题与思考题答案(完整英文版第2版)

    《算法导论及课后习题与思考题答案(完整英文版第2版)》是一部由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein共同编写的权威性教材,旨在为学生提供深入理解和掌握算法设计与分析的...

    完整的算法导论习题答案 完整的算法导论习题答案

    标题和描述中提及的是“完整的算法导论习题答案”,这表明文档包含了针对《算法导论》一书中的练习题解答。《算法导论》是一本经典的计算机科学教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest等...

    算法设计与实现-绪论与算法效率分析

    - 通过习题练习,学生可以巩固所学知识,进一步理解和应用算法设计与效率分析的原理。 8. **参考教材**: - 提供的参考教材可以作为深入学习和扩展知识的资源。 总的来说,理解和掌握算法设计与效率分析是每个...

    算法导论第十九章习题解答

    《算法导论》是计算机科学领域的一本经典著作,它深入浅出地介绍了...学习这些习题解答有助于加深对图算法的理解,并提升编程解决问题的能力。在实际应用中,理解并掌握这些算法可以有效解决复杂问题,优化计算效率。

    蓝桥杯C-C++算法练习题

    蓝桥杯竞赛练习题的题解(C/C++/Java)蓝桥杯是中国面向中学生的计算机科学和信息技术竞赛,旨在激发学生对计算机科学的兴趣、培养其创新能力。每年的蓝桥杯比赛都包含了一系列算法题目,涉及数据结构、图论、动态规划...

    KMean聚类练习_K-means练习题_k均值习题_新手练习python_

    自己照着做的一些kmeans练习,适合新手看

    hit.rar_HIT-acm-HOJ-answer_算法 课件_课件

    通过系统的课程学习和习题练习,可以有效地提升算法设计和分析能力,为未来的编程工作或参加编程竞赛打下坚实的基础。在学习过程中,应注重理论与实践的结合,不断挑战自己,解决更复杂的问题,从而不断提高自己的...

Global site tag (gtag.js) - Google Analytics