排序用建議實現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演算法
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演算法有哪些分別
您好:
java中的演算法,常見的有:遞歸、迭代、查找、排序(包含冒泡排序、選擇排序、插入排序、快速排序四種) 等,演算法有很多,一般數據結構中涉及到的都可以用java語言實現。
舉幾個例子:
1.遞歸的例子:
不一一舉例,僅供參考!
⑷ JAVA使用什麼加密演算法和解密演算法好
簡單的Java加密演算法有:
第一種. BASE
Base是網路上最常見的用於傳輸Bit位元組代碼的編碼方式之一,大家可以查看RFC~RFC,上面有MIME的詳細規范。Base編碼可用於在HTTP環境下傳遞較長的標識信息。例如,在Java Persistence系統Hibernate中,就採用了Base來將一個較長的唯一標識符(一般為-bit的UUID)編碼為一個字元串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程序中,也常常需要把二進制數據編碼為適合放在URL(包括隱藏表單域)中的形式。此時,採用Base編碼具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。
第二種. MD
MD即Message-Digest Algorithm (信息-摘要演算法),用於確保信息傳輸完整一致。是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、哈希演算法),主流編程語言普遍已有MD實現。將數據(如漢字)運算為另一固定長度值,是雜湊演算法的基礎原理,MD的前身有MD、MD和MD。廣泛用於加密和解密技術,常用於文件校驗。校驗?不管文件多大,經過MD後都能生成唯一的MD值。好比現在的ISO校驗,都是MD校驗。怎麼用?當然是把ISO經過MD後產生MD的值。一般下載linux-ISO的朋友都見過下載鏈接旁邊放著MD的串。就是用來驗證文件是否一致的。
MD演算法具有以下特點:
壓縮性:任意長度的數據,算出的MD值長度都是固定的。
容易計算:從原數據計算出MD值很容易。
抗修改性:對原數據進行任何改動,哪怕只修改個位元組,所得到的MD值都有很大區別。
弱抗碰撞:已知原數據和其MD值,想找到一個具有相同MD值的數據(即偽造數據)是非常困難的。
強抗碰撞:想找到兩個不同的數據,使它們具有相同的MD值,是非常困難的。
MD的作用是讓大容量信息在用數字簽名軟體簽署私人密鑰前被」壓縮」成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的十六進制數字串)。除了MD以外,其中比較有名的還有sha-、RIPEMD以及Haval等。
第三種.SHA
安全哈希演算法(Secure Hash Algorithm)主要適用於數字簽名標准(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。對於長度小於^位的消息,SHA會產生一個位的消息摘要。該演算法經過加密專家多年來的發展和改進已日益完善,並被廣泛使用。該演算法的思想是接收一段明文,然後以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),並把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。散列函數值可以說是對明文的一種「指紋」或是「摘要」所以對散列值的數字簽名就可以視為對此明文的數字簽名。
SHA-與MD的比較
因為二者均由MD導出,SHA-和MD彼此很相似。相應的,他們的強度和其他特性也是相似,但還有以下幾點不同:
對強行攻擊的安全性:最顯著和最重要的區別是SHA-摘要比MD摘要長 位。使用強行技術,產生任何一個報文使其摘要等於給定報摘要的難度對MD是^數量級的操作,而對SHA-則是^數量級的操作。這樣,SHA-對強行攻擊有更大的強度。
對密碼分析的安全性:由於MD的設計,易受密碼分析的攻擊,SHA-顯得不易受這樣的攻擊。
速度:在相同的硬體上,SHA-的運行速度比MD慢。
第四種.HMAC
HMAC(Hash Message Authentication Code,散列消息鑒別碼,基於密鑰的Hash演算法的認證協議。消息鑒別碼實現鑒別的原理是,用公開函數和密鑰產生一個固定長度的值作為認證標識,用這個標識鑒別消息的完整性。使用一個密鑰生成一個固定大小的小數據塊,即MAC,並將其加入到消息中,然後傳輸。接收方利用與發送方共享的密鑰進行鑒別認證等。
⑸ 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三個數排序比較大小的完整代碼,並給出詳細解釋,初學者,謝謝
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語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論
⑺ java中的演算法,一共有多少種,哪幾種,怎麼分類。
就好比問,漢語中常用寫作方法有多少種,怎麼分類。
演算法按用途分,體現設計目的、有什麼特點
演算法按實現方式分,有遞歸、迭代、平行、序列、過程、確定、不確定等等
演算法按設計范型分,有分治、動態、貪心、線性、圖論、簡化等等
作為圖靈完備的語言,理論上」Java語言「可以實現所有演算法。
「Java的標准庫'中用了一些常用數據結構和相關演算法.
像apache common這樣的java庫中又提供了一些通用的演算法
⑻ Java單多線程求pair值演算法比較
單線程比多線程更快。你的測試代碼只是用了CPU資源。因為多線程需要處理線顫改程的開銷,開銷多了自然沒有單線程快。
多線程是為了更充分的利用計算機的資源。比如網路,IO,CPU...如果你在for循環里芹洞此加入一個磁碟寫入操作,多嫌迅線程就會比單線程快了
⑼ 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單多線程求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