java演算法優化
java是建立在許多軟體基礎上的編程語言,對於演算法程序的優化手段受到很大限制,這些都不利於做演算法
可以考慮用c做演算法,可以在兼顧可移植性的同時盡量優化,然後在java中調用。
㈡ 小明買四個商品,這四個商品相加是7.11,相乘也是7.11。求出四個商品的價格,並且優化演算法。(Java)
易語言例子 ps毫秒級計算
.版本 2
.計次循環首 (711, x)
.計次循環首 (711-x,y)
.如果真 (y>x)
跳出循環 ()
.如果真結束
.計次循環首 (711-x-y,z)
.如果真 (z>y)
跳出循環 ()
.如果真結束
t=711-(x+y+z)
.如果真 (x×y×z×t=711000000)
'這里輸出 x=150 y=125 z=120 t=316
返回 ()
.如果真結束
.計次循環尾 ()
.計次循環尾 ()
.計次循環尾 ()
㈢ 怎樣利用Java開發高性能
1、開發高性能Java程序的原則和方法:
決定一個Java程序性能的好壞,是多方面的因素,包括前期的系統結構設計、底層平台架構設計、應用開發中的代碼編寫以及技巧的使用,系統平台的軟體配置,系統平台的硬體性能等等。這里只給出代碼編寫方面的一些原則和方法。
相對於Java的其他方面,在性能領域Java飽受的非議可能最多。許多人認為,Java如果想更好的發展下去必須解決性能問題。然而真正的事實是Java在編譯器、JVM以及運行期優化方面確實在不斷的進步,Java正在運行的越來越快。實際上很多的性能問題,是由於設計不佳引起的,與Java本身並無關系。在拙劣的設計和編碼面前,無論你使用多少運行期優化,無論你的編譯技術多麼先進,無論你的硬體平台性能多麼強大,最後的代碼運行依然低效。
同樣無論運行期優化技術、編譯技術以及硬體平台多麼強大,運用一些已被驗證對Java運行性能有益的技術,總是能獲得非常好的收益。
優化程序代碼的注意事項:
1.除非必須優化,否則不要輕易改動;
2.改動之後要進行仔細的測試;
3.在各個JVM產品中,優化的方式是有區別的;
2、高性能Java的編碼原則:
(1)、先把焦點放在設計、數據結構和演算法身上;
(2)、不要依賴於編譯器編譯期優化技術,正確理解運行期代碼優化技術以及正確使用運行期代碼優化;
(3)、使用StringBuffer類完成字元串連接;
(4)、將對象創建成本降至最低,即盡量創建輕量級對象;
1、合理設計對象大小
2、合理設計類的繼承深度
3、類的構造函數要短小精幹
4、不要創建非必要的對象
5、將對象的創建拖延到最後一刻,即延遲載入技術
6、可能的話要自己實現一個對象緩沖管理池,將對象的創建與回收控制在一個合理的范圍內
(5)、降低同步化帶來的影響;
1、合理識別是否一定要使用同步控制,盡量從設計上避免
2、注意控制同步代碼范圍,避免對線程活躍度造成影響
3、合理使用鎖變數,做到線程分離,提高程序並發度,更進一步提高程序吞吐量
4、用於鎖變數的對象不宜過多,當要使用多個對象作為鎖變數時,一定要確保在代碼中自始自終按照同樣的順序鎖定它們,否則可能導致死鎖
(6)、盡可能使用Stack變數和基本類型完成必要的任務;
(7)、使用static、final、private方法以促成inlining;
(8)、實例變數初始化一次就好;(即一定義就會有一個初始值,下面不需要再進行一次初始化)
(9)、集群類對象的處理;
(10)、盡可能重用對象;(11)、使用延遲載入技術;
㈣ java中重寫equals()、hashCode()方法有什麼好處怎麼優化演算法有沒有關於hashCode優化的電子書呢
這二個方法是父類的方法(object類),你也可以重寫這二個方法。
equals()是二個對象比較的方法。
hashcode是取得內在地址。
㈤ 大學java中都學過哪些經典演算法請學過的朋友解答下
¤ 歸並排序演算法
¤ 枚舉法
¤ 數字全排列問題
¤ 優化高精度減法
¤ 高精度階乘
¤ 高精度減法
¤ 高精度乘法
¤ Dijkstra最短路徑(一點到各頂點最短路徑)
¤ 八皇後問題
¤ 快速排序演算法
¤ 地圖四色問題
¤ 穿越迷宮
¤ 常用排序演算法
¤ 二分查找法完整版
¤ 標准快速排序演算法
¤ 一躺快速排序法
¤ 快速排序演算法
¤ 插入排序演算法
¤ 選擇排序演算法
¤ 冒泡排序演算法
¤ 統計演算法
¤ 常用演算法——廣度優先搜索
¤ 常用演算法——深度優先搜索
㈥ java性能優化權威指南和java程序性能優化哪本好
1、調整垃圾收集(GC)
由於垃圾收集的復雜性,很難發現你的應用的准確性能。不過,如果你真的想優化你的應用,你應該相應地處理垃圾收集。通用的准則是調整GC設置並同時執行性能分析。
一旦你對結果感到滿意,你可以停止該過程並尋求其他優化方式。確保除了在平均事務處理時間之外,你還留心了異常值。這些異常值是造成Java應用緩慢的真正的罪魁禍首並且很難找到。
此外,你要明白應用運行期間性能下降的效應。在每單個cpu時鍾內的緩慢操作是可以忽略的,但在每單個資料庫事務中的緩慢操作則是非常昂貴的消耗。但是你應該根據性能短板選擇你的優化策略,並應該根據工作負載來優化應用。
2、正確地選擇適合你的GC演算法
讓我們更深入地探討GC優化。畢竟,GC優化是要處理的整個優化問題中最基本的。目前,Java中有四種供你選擇的垃圾收集演算法。每種演算法滿足不同的需求,因此你要選擇(適合你的需求的)。很多開發人員正是因為不了解GC演算法而未能優化他們的應用。
這四個演算法分別是串列回收器,並行/吞吐量回收器,CMS回收器和G1回收器。想要了解更多關於每種垃圾收集器的信息及它們是如何工作的,請查看這篇來自Takipi博客的非常棒的文章Garbage Collectors—Serial vs。 Parallel vs。 CMS vs。 G1。這篇文章同時還討論了Java8對GC演算法的影響及其他細節上的改變。讓我們再回到GC演算法上,根據Understanding Java Garbage Collection這篇文章所述,並發標記和清除GC(即」CMS」)演算法才是適合網路服務端應用的最佳演算法。並行GC演算法適合那些內部可預測的應用。
G1和CMS是並發操作的理想選擇,但仍然會引起(應用)頻繁停頓。實際的選擇取決於你如何取捨。舉例來說,盡管選擇並行演算法會帶來更長的GC停頓時間,但相較於其他GC演算法,選擇並行演算法仍是一個好主意。
3、Java堆
Java內存堆在迎合內存需求方面擔任了至關重要角色。通常更好的做法是初始時分配最小的堆,然後通過持續的測試不斷增加它的大小。大多數時候優化問題都可以通過增加堆的大小解決,但如果存在大量的GC開銷,則該解決方案不起作用。
GC開銷還會使吞吐量急劇下降,進而使得應用難以形容的慢。此外,及早調整GC可以幫助你避免堆大小分配的問題。開始的時候,你可以選擇任何1GB到8GB的堆大小。當你選擇正確的堆大小,老生代和新生代對象的概念也就不需要了。總而言之,堆大小應該取決於老生代和新生代對象的比率,之前的GC優化和對象集合(即所有對象佔用的內存大小)。
4、關鍵應用優化
關鍵代碼優化是優化你的Java應用最好的方式。如果你的應用對GC和堆優化沒有反應,那麼最好是做架構改進並關注於你的應用是如何處理信息的。使用聰明的演算法並管理好對象就能解決大量的問題,包括內存碎片,堆大小問題和垃圾收集的問題。
5、使用最優的函數
Java提供了多個函數來提升演算法效率。如果你使用StringBuilder代替簡單的String,你可以得到微乎其微的性能提升。不過,我們還有其他方式在代碼層面進行優化。讓我們看看下面這些優化方法。
使用StringBuilder代替+操作符。
避免使用iterator。
多使用棧帶來的好處。
避免使用正則表達式,使用Apache Commons Lang作為代替。
遠離遞歸。遞歸會佔用大量資源!
㈦ 用遺傳演算法優化插入序列(二叉搜索樹) Java
要是有點c基礎的話可以看看c++ primer 看看前幾章的容器和泛型演算法 用這個實現遺傳演算法解決旅行商問題 代碼100行左右
㈧ 一個演算法問題(最好是java的)
看了一下,好像不容易!
可以把每個矩形的一個對象,只有長寬兩個長度屬性,進行組合,
它們之間空隙越少越好,就是愈接近他們的面積和效果越好!
不過這個重點在於這個組合過程,長度越接近的就讓他們的邊盡量重合,不過好像很難,如果屬性圖形學的說不定有相應的演算法,有空再回頭看吧!
_______________________________________________________________
上面對矩形的屬性還應該增加一個屬性:方向,就是讓它橫放還是豎放。至於斜放那就不用考慮了!
演算法:
1)可以尋找存在有等邊情況的矩形,將這些矩形先拼接成一個矩形,
接著尋找矩形中存在一個矩形邊等於若干個矩形邊的和,把這些矩形拼接起來,(但這樣有可能不一定是最優的)。最後尋找那些邊長接近的拼接起來,知道沒有新的矩形!不過數學功底不夠,沒辦法形式化證明最小。
2)另外可以用窮舉法(當N不大時很適合),而且完全可以實現,就是用組合排列(包括對相對位置和方向(2個旋轉方向)進行全排列),例如當N=2,它們相對位置的組合中有效的是:4種。計算每一種可能取最小的就OK!
但這個演算法效率比較低,當然裡面有很多是重復的,可以優化演算法!
總結:上面都是邊寫邊想的,很隨意。不過第二個演算法一定可行,但需要優化。數學知識不夠,只能到此。至於實現那就容易了,只要演算法好。時間緣故停在此吧!~不過你的題目挺有意思的!若誰有好的演算法,期待中……
㈨ java演算法面試題
三個for循環,第一個和第二個有啥區別?去掉一個吧
可以用迭代器remove方法,在移除的同時添加。
不知道是你記錯了還是題本身就這樣,我只想說:
寫這代碼的是二貨么?
1、每個循環的索引都是從0開始,這是什麼遍歷方式?
2、看這題的目的是想把用戶添加到相應的組里,這我就不明白了,新建一個用戶的時候就沒分配組么?那用戶的GroupId哪來的?
3、這是一個操作,難道就不會根據GroupId直接查出用戶或者組么?
這哪是優化代碼?分明是挖坑。