当前位置:首页 » 操作系统 » java比较算法

java比较算法

发布时间: 2023-05-18 11:18:18

java中的算法,一共有多少种,哪几种,怎么分类。

就好比问,汉语中常用写作方法有多少种,怎么分类。

算法按用途分,体现设计目的、有什么特点
算法按实现方式分,有递归、迭代、平行、序列、过程、确定、不确定等等
算法按设计范型分,有分治、动态、贪心、线性、图论、简化等等

作为图灵完备的语言,理论上”Java语言“可以实现所有算法。
“Java的标准库'中用了一些常用数据结构和相关算法.

像apache common这样的java库中又提供了一些通用的算法

② 求一个比较大小的JAVA算法

1.是的
2.a-可以直接求和,b-利用近似公式
3.近似公式为e=(1+1/n)^n,n->无穷大
4.这两个公式都需要运算n到足够大来减少误差
假如你运算到n=k满足精度需要了
那么你首先要保证当n=k-1时算出的值与n=k的值差别小于0.0001
假如需要考虑截断误差,那么你就要考虑到任何一个1/n或者1/n!的形式的截断误差,以及运算中每一步的累计误差,都是可以计算的
从累积误差的角度来说,第一个方法较优
因为每一个求和项目都是整数的倒数,只发生一次截断
之后的误差计算直接将最大误差可能求和就可以了
而且每一次迭代可以应用上一次的结果,效率较高
但是缺点是当n比较大的时候,n!也会是一个比较大的数,n的类型定义得不好会溢出
第二个方法就需要计算一次截断误差,并且计算n次方的误差累积

③ java比较2个文件是否是相同的文件,是一个一个字节比较还是计算MD5比较好啊

不同内容得出相同MD5值,虽然概率低,但总是不放心。如果在已知文件编码范围的条件下,找到MD5绝对区分长度范围(即:该范围内取样内容的MD5相同的,内容保证相同;绝不存在不同内容得出相同MD5值的现象),那么,可按合理的长度分片、按一定顺序遍历整个文件(属性信息、头部、尾部、同步随机点、其他),比较MD5,一旦有异立即判定文件不同,终止比较。这种分片取样比较MD5的思路可能快于逐字节比较也绝对可信

要确保 100%正确就必须校验全文,通过以上思路来比较,即是。
(注:

其他据说相对于MD5来讲不易碰撞(即不同内容得出相同MD5值的概率可能更低)的算法推荐:起码 SHA1 ,最好 SHA256、 SHA512、MD5+CRC32、HMAC,或者几种不同类型算法的同步进行。

在精通算法的情况下,将这里推荐的算法取代上文中提到的MD5来考量,能扩大绝对区分长度范围,可能更方便更快的比较。

但是又有这样的考虑:逐字节比较的算法最简单,算法弄复杂了反而会增加额余的时间;逐字节比较的算法也可以放到上文中来考量,进行同步取样和各种遍历的顺序与方式,说不定,在保证100%的可信度的条件下,逐字比较反而最快呢?
我觉得时间的耗费关键处在于,所有的算法,都要将两个位于不同区域或载体的文件的同位区域收集到一起进行比较,这个收集花费时间Ta(i),与取样长度、存储区域或载体等相关;{如果要将文件取很大一部或全部读入内存,然后再逐一集中比较,则会减小以上的Ta(i),而增加一个额外读入的时间Tc(i)*次数M(i)}。比较的次数大致为N(i);而如果在一个文件中顺序读取一个区域并且计算它的某个整体评定值,这个花费的时间为Tb(i),与取样长度、计算程序、设备性能等相关。

总体的比较时间大致是Ta(i)*N(i)*Tb(i)+{Tc(i)*M(i)}
逐字节比较,其中Tb(i)、Ta(i)都是最短的,但是N(i)最大,

总之,可以设计不同的算法,通过实际环境和文件的检测,来决定采用何种算法。


外一则:
两个取样内容, MD5等算法的计算值 不同,则内容一定不同; 计算值相同,则 内容可能相同,但可能性是否达到100%,内容相同的概率是多少,根据编码范围、算法来确定。如果是比较一个文件和许多其他文件是否相同,并且提前知道其他文件的 MD5 值,可先比较 MD5 值可以大大提高文件比较的速度。

④ java如何比较一维数组大小

boolean isEqual(int[] a, int b[])
{
int n = a.length;

if(n != b.length) //数组长度销耐不相等 返回false
return false;

for(int i =0 ;i <n;i++)
{
if(a[i] != b[i]) //对应元素不尘斗竖相派大等 返回false
{
return false;
}
}

return true; //长度相等 对应元素也相等 返回true
}
}

⑤ Java单多线程求pair值算法比较

进程和线程的概念

什么是进程

一个进程就是在一个运行的程序 它有自己独立的内存空间 一组系统资源 每个进程的内部数据和状态都是独立的 例如在window是同时打开多个记事本 虽然它们所运行的程序代码都是一样的 但是所使用的内存空间是独立的 互不干扰

什么是线程

线程与进程相似 是一段完成某个特定功能的代码 是程序中单个顺序的流控制;但与进程不同的是 同类的多个线程共享一块内存空间和一组系统资源 而线程本身的数据通常只有微处理器的寄存器数据 以及一个供程序执行时使用的堆栈

进程与线程的区别

进程:每个进程都有独立的代码和数据空间(进程上下文) 进程切换的开销大

线程:轻量的进程 同一类线程共享代码和数据空间 每个线程有独立的运行栈和程序计数器(PC) 线程切换的开销小

多进程:在操作系统中 能同时运行多个任务程序

多线程:在同一应用程序中 有多个顺序流同时执行

线程创竖态梁建的两种方式

采用继承Thread类创建线程

该方法比较简单 主要是通过继承java lang Thread类 并覆盖Thread类的run()方法来完成线成的创建 Thread 类是一个具体的闭悄类 即不是抽象类 该类封装了线程的行为 要创建一个线程 程序员必须创建一个从 Thread 类导出的新类 Thread类中有两个最重要的函数run()和start()

通过实现Runnable接口创建线程

该方法通过生成实现java lang Runnable接口的类 该接口只定义了一个方法run() 所以必须余运在新类中实现它 但是 Runnable 接口并没有任何对线程的支持 我们还必须创建 Thread 类的实例 这一点通过 Thread 类的构造函数

public Thread(Runnable target);来实现

单线程和多线程性能比较

以使用蒙特卡罗概率算法求π为例 进行单线程和多线程时间比较

什么是蒙特卡罗概率算法

蒙特卡罗法(Monte Carlo method)是以概率和统计的理论 方法为基础的一种计算方法 将所求解的问题同一定的概率模型相联系 用电子计算机实现统计模拟或抽样 以获得问题的近似解 故又称统计模拟法或统计试验法 网络

蒙特卡罗求算法求π

第一步

画正方形和内切圆

第二步

变换表达式

正方形面积As=( R)^

圆的面积Ac=πR^

Ac/As=( R)^ /πR^

π= As/Ac

令P=As/Sc 则π= P

第三步

重复N次实验求平均值

在正方形区域内随机生成一个点A 若A落在圆区域内 M++

P=M/N

π= P N的取值越大 π的值越精确

java代码实现算法

N取值为 万 多线程的数为 每个线程执行 万次模拟实验

线程实现

import ncurrent CountDownLatch;

public class ProModel implements Runnable {

public int N;//随机实验的总次数

public static int M;//随机点落在圆中的次数

private int id;

private final CountDownLatch doneSignal;

OBJ semaphore;

public ProModel(int id CountDownLatch doneSignal int N OBJ semaphore ){

this id=id;

this doneSignal=doneSignal;

this N=N;

this semaphore=semaphore ;

M= ;

}

public void run(){

int tempM= ;

for(int i= ;i<N;i++){

if(isInCircle()){

tempM++;

}

}

synchronized (semaphore) {

add(tempM);

}

untDown();//使end状态减

}

public void add(int tempM){

System out println(Thread currentThread() getName());

M=M+tempM;

System out println(M);

}

//随机产生一个在正方形区域的点 判断它是否在圆中

public boolean isInCircle(){

double x=Math random();

double y=Math random();

if((x )*(x )+(y )*(y )< )

return true;

else

return false;

}

public static int getTotal(){

return M;

}

}

多线程Main实现

import ncurrent CountDownLatch;

import ncurrent ExecutorService;

import ncurrent Executors;

public class MutliThread {

public static void main(String[] args) throws InterruptedException {

long begin=System currentTimeMillis();

int threadSize= ;

int N= ;

OBJ semaphore = new OBJ();

CountDownLatch doneSignal = new CountDownLatch(threadSize);

ProModel[] pros=new ProModel[threadSize];

//设置特定的线程池 大小为threadSizde

System out println( begins! );

ExecutorService exe = Executors newFixedThreadPool(threadSize);

for(int i= ;i<threadSize;i++)

exe execute(new ProModel(i+ doneSignal N semaphore));

try{

doneSignal await(); //等待end状态变为 }catch (InterruptedException e) {

// TODO: handle exception

e printStackTrace();

}finally{

System out println( ends! );

System out println( *(float)ProModel getTotal()/(float)(threadSize*N));

}

exe shutdown();

long end=System currentTimeMillis();

System out println( used time(ms): +(end begin));

}

}

class OBJ{}

单线程Main实现

import ncurrent CountDownLatch;

import ncurrent ExecutorService;

import ncurrent Executors;

public class SingleThread {

public static void main(String[] args) {

long begin=System currentTimeMillis();

int threadSize= ;

int N= ;

OBJ semaphore = new OBJ();

CountDownLatch doneSignal = new CountDownLatch(threadSize);

ProModel[] pros=new ProModel[threadSize];

//设置特定的线程池 大小为

System out println( begins! );

ExecutorService exe = Executors newFixedThreadPool(threadSize);

for(int i= ;i<threadSize;i++)

exe execute(new ProModel(i+ doneSignal N semaphore));

try{

doneSignal await(); //等待end状态变为 }catch (InterruptedException e) {

// TODO: handle exception

e printStackTrace();

}finally{

System out println( ends! );

System out println( *(float)ProModel getTotal()/(float)(threadSize*N));

}

exe shutdown();

long end=System currentTimeMillis();

System out println( used time(ms): +(end begin));

}

}

运行结果比较

lishixin/Article/program/Java/gj/201311/27648

⑥ java实现几种常见排序算法

下面给你介绍四种常用排序算法:

1、冒泡排序

特点:效率低,实现简单

思想(从小到大排):每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。这只是冒泡排序的一种,当然也可以从后往前排。

⑦ Java单多线程求pair值算法比较

  • 单线程比多线程更快。你的测试代码只是用了CPU资源。因为多线程需要处理线颤改程的开销,开销多了自然没有单线程快。

  • 多线程是为了更充分的利用计算机的资源。比如网络,IO,CPU...如果你在for循环里芹洞此加入一个磁盘写入操作,多嫌迅线程就会比单线程快了

⑧ java 比较大小算法

排序用建议实现comparable类吧 自定义排序比较的参数 否则对象是没法比较大小的 只能比较是否相等
class One implements Comparable{
int age;

@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
One one = (One)o;
if(one.age > this.age)
return -1;
else if( one.age < this.age)
return 1;
else
return 0;
}
}
大概这个意思 这是对象比较大小
对象数组同样也这样比较,数值数组直接循环比较就行

⑨ java十大算法

算法一:快速排序算法
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

算法步骤:

1 从数列中挑出一个元素,称为 "基准"(pivot),

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

算法二:堆排序算法
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆排序的平均时间复杂度为Ο(nlogn) 。

算法步骤:

创建一个堆H[0..n-1]

把堆首(最大值)和堆尾互换

3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置

4. 重复步骤2,直到堆的尺寸为1

算法三:归并排序
归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

算法步骤:

1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置

3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

4. 重复步骤3直到某一指针达到序列尾

5. 将另一序列剩下的所有元素

⑩ java三个数排序比较大小的完整代码,并给出详细解释,初学者,谢谢

import java.util.Arrays;

import java.util.Collection;

public class Demo2 {

public static void main(String[] args) {

// 这是你的三个数

int[] arr = { 12, 32, 18 };

// 两层嵌套循环

for (int i = 0; i < arr.length; i++) {

for (int j = 0; j < i; j++) {

// 如果后者小于前者,让他们交换位置,一直循环

// 直到每个数字都从头到尾跟数组里的每个数字比较一次

if (arr[i] < arr[j]) {

// 这三步就是交换位置,相信聪明的你一定看得懂了

arr[i] = arr[i] + arr[j];

arr[j] = arr[i] - arr[j];

arr[i] = arr[i] - arr[j];

}

}

}

//最后打印出来

for (int i = 0; i < arr.length; i++) {

System.out.println(arr[i]);

}

}

}

资料拓展:

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论

热点内容
安卓qq邀请码在哪里寻找 发布:2025-05-15 00:02:04 浏览:33
三菱fx编程口 发布:2025-05-15 00:01:23 浏览:809
医院招商引资宣传片脚本 发布:2025-05-15 00:01:21 浏览:367
linuxcftp服务器 发布:2025-05-14 23:58:18 浏览:717
探岳什么配置才有驾驶模式选择 发布:2025-05-14 23:53:17 浏览:144
如何在手机上看无限流量密码 发布:2025-05-14 23:43:31 浏览:114
19投篮脚本 发布:2025-05-14 23:36:57 浏览:513
编译器怎么处理c变长数组 发布:2025-05-14 23:31:46 浏览:663
存折每天可以输错多少次密码 发布:2025-05-14 23:22:06 浏览:909
安卓手机怎么找微信隐藏对话 发布:2025-05-14 23:07:47 浏览:338