環保署 7 月起 補助汰換二行車機車新購電動二輪車

為加速淘汰二行程機車並推廣電動二輪車,環保署 23 日預告訂定「淘汰二行程機車及新購電動二輪車補助辦法」。環保署表示,民眾汰換二行程機車並新購電動機車目前補助 3,000 元,未來將加碼補助,其中汰換二行程機車並新購重型電動機車,環保署加上經濟部總計補助 20,400 元,汰換二行程機車並新購輕型、小輕型電動機車總共補助 15,000 元。   環保署表示,二行程機車相較於四行程機車,碳氫化合物排放量約為 18 倍,一氧化碳排放量約為 2 倍,污染嚴重,因此於 2004 年實施機車第四期排放標準時,加嚴二行程機車的標準,促使國內不再生產銷售二行程機車,依據交通部車輛登記資料統計,截至今年 4 月底止,二行程機車仍有約 200 萬輛。   「淘汰二行程機車及新購電動二輪車補助辦法」中電動二輪車包括電動機車、電動自行車及電動輔助自行車等都有補助,民眾淘汰二行程機車並新購上述的電動二輪車,皆有補助,預計新補助辦法在 7 月 15 日開始推動,但環保署強調,若民眾只汰換二行車機車而沒有新購電動機車,環保署僅補助 1,500 元。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

Jmeter與壓測相關概念

相關概念

RT(response time)

什麼是RT? RT就是指系統在接收到請求和做出相應這段時間跨度

但是值得一提的是RT的值越高,並不真的就能說明我們的系統的吞吐量就很高, 比如說,如果存在數據在網絡中傳輸時出現了丟包的現象,傳輸的數據少了,速度就會增加, 但是這是事故,不是說我們的系統吞吐量高

此外,對不同的系統來說衡量的標準也不一樣,對一個遊戲軟件來說,響應時間也就是常說的延遲. 在100ms以內,遊戲體驗感會很好,飆升到幾秒鐘,乾脆就不要玩了, 但是對一個編譯系統來說,編譯一套源代碼可能好幾十分鐘,人們也願意等

java應用程序中的GC也會導致系統的總體RT飆升

Throughput 吞吐量

什麼是吐吞量呢? 百度百科: 廣義的吞吐量是: 單位時間內成功的傳輸數據的數量, 在我們進行壓力測試得出的結果中, 可以將吞吐量理解成系統在單位時間內成功處理的請求的數量

一個系統的吞吐量和request對CPU的消耗,外部的接口以及IO等因素緊密相關,

比如一個web應用代碼寫的再漂亮,但是每次請求都會去查詢數據庫,併發數上來后,數據庫就會佔用大量的CPU負載,系統的IO飆升,甚至可能導致其他軟件不得不等待mysql先執行完才能搶到CPU的時間分片. 系統的瓶頸積壓到mysql這裏,這個web應用的吞吐量一定不會很高

此外,一般我們都是這樣描述吞吐量: 在併發數為xxx時,系統的吐吞量為yyy

併發用戶數

它指的是系統可以承載的, 可以同時正常使用網站的用戶數量, 這個指標似乎看起來可以比吞吐量更加直觀反應系統的性能, 但是往往系統中的用戶又有不同的行為, 比如未註冊的, 在線的, 同時發送請求的等等, 簡而言之, 可以考慮用在線的用戶和同時發送請求的用戶數作為性能指標, 把在線的用戶當成性能指標更直觀, 把同時發送請求的用戶數量當成性能指標更準確

QPS (query per seconds)

每秒的查詢率, 用來權衡服務器在規定的時間內處理的流量數

計算公式: QPS = req / sec , 即平均每秒的請求量

TPS (transition per seconds)

TPS (transaction per second)代表每秒執行的事務數量,可基於測試周期內完成的事務數量計算得出。例如,用戶每分鐘執行6個事務,TPS為6 / 60s = 0.10 TPS。同時我們會知道事務的響應時間(或節拍),以此例,60秒完成6個事務也同時代表每個事務的響應時間或節拍為10秒

PV和UV

PV訪問量 (Page View) 每打開一次頁面或者刷新一次頁面 pv+1, 它反應的的網站的頁面被訪問的次數

UV訪問數(Unique Visitor) 即, 獨立訪客的訪問數, 換句話就是一台電腦算一個訪客,

  • 通過QPS估算PV

公式1 : pv = QPS*3600*6

公式2: pv = QPS*3600*8

  • 根據QPS,PV估算服務器的數量

服務器的數量= 每天的總PV / 單台服務器的PV

原理: 每天80%的訪問集中在了當前的20%的時間段, 這20%的時間就叫做峰值時間

峰值時間段 QPS = 總pv數*0.8 / 每天的秒數*0.2

Jmeter

jmeter能做什麼?

Jmeter也是apache的頂級項目, 通過jmeter我們可以測試靜態和動態資源,web動態應用程序的性能, 還可以用來模擬服務器,服務器中,網絡或者對象上的高負載, 測試他們的強度,以及不同負載下的總體性能

使用環境: Windows

使用的思路: 在jmeter提供的可視化頁面中,添加一個一個的指定的模塊. 對我們的web項目中指定的接口進行壓力測試,當然它不僅僅使用於發送http請求測試web項目的資源接口

添加什麼模塊呢?

  • 線程組: 也就是啟動多少條線程對系統壓測, 線程是否併發的啟動
  • http的默認參數: 比如protocol host port 等等
  • 添加請求的參數/請求體/cookie等信息
  • 添加監聽器來显示壓測結果

實例:

添加線程組,每輪同時啟動1000條線程對系統進行壓測,重複1輪

添加默認使用的請求參數, 這個默認的請求參數並不要求強制添加,只是為了以後在具體的某個http請求壓測模塊不寫請求參數時,使用這裏面的默認參數

配置信息如下:

添加一個sample, 這個sample其實就是http請求, 一個具體的http請求, 用大白話說 ,我們想壓測系統中的登錄方法,就添加一個登錄sample, 想壓測系統中拉取個人信息的方法, 就添加一個 個人信息sample

sample詳細配置

可以看到上圖中我們可以添加request Param request body, 上傳文件, 甚至可以添加一個模塊添加請求的cookie模塊

添加Listenner, 選擇聚合報告 ,開始壓測得到下面的結果,我們關注圖中的吞吐量

支持使用配置文件中的數據當成壓測的參數, 使用場景: 通過這個配置文件的配置,我們可以模擬出多用戶併發訪問系統的場景,下面配置中的每一行都是一個用戶的信息,jmeter會自動讀取這個配置文件中的每一行,使用這裏面的信息進行壓力測試,直到達到了用戶指定的請求量才結束

編寫配置文件

導入配置文件

使用配置文件,詳細的配置細節我都標在了圖片中

發送請求

使用環境: linux

第一步: 在window上錄好 XXX.jmx 文件

第二步: 啟動

sh jmeter.sh -n -t XXX.jmx -l result.jtl

第三步:將result.jtl導回到window上的jmeter中在可視化頁面中查看結果

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

淺談什麼是動態規劃以及相關的「股票」算法題:一網打盡「買賣股票的最佳時機」

本文首發於公眾號「五分鐘學算法」,是系列文章之一。

個人網站:

動態規劃

1 概念

  動態規劃算法是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞推(或者說分治)的方式去解決。在學習動態規劃之前需要明確掌握幾個重要概念。

  階段:對於一個完整的問題過程,適當的切分為若干個相互聯繫的子問題,每次在求解一個子問題,則對應一個階段,整個問題的求解轉化為按照階段次序去求解。

  狀態:狀態表示每個階段開始時所處的客觀條件,即在求解子問題時的已知條件。狀態描述了研究的問題過程中的狀況。

  決策:決策表示當求解過程處於某一階段的某一狀態時,可以根據當前條件作出不同的選擇,從而確定下一個階段的狀態,這種選擇稱為決策。

  策略:由所有階段的決策組成的決策序列稱為全過程策略,簡稱策略。

  最優策略:在所有的策略中,找到代價最小,性能最優的策略,此策略稱為最優策略。

  狀態轉移方程:狀態轉移方程是確定兩個相鄰階段狀態的演變過程,描述了狀態之間是如何演變的。

2 使用場景

能採用動態規劃求解的問題的一般要具有 3 個性質:

  (1)最優化:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構,即滿足最優化原理。子問題的局部最優將導致整個問題的全局最優。換句話說,就是問題的一個最優解中一定包含子問題的一個最優解。

  (2)無後效性:即某階段狀態一旦確定,就不受這個狀態以後決策的影響。也就是說,某狀態以後的過程不會影響以前的狀態,只與當前狀態有關,與其他階段的狀態無關,特別是與未發生的階段的狀態無關。

   (3)重疊子問題:即子問題之間是不獨立的,一個子問題在下一階段決策中可能被多次使用到。(該性質並不是動態規劃適用的必要條件,但是如果沒有這條性質,動態規劃算法同其他算法相比就不具備優勢)

3 算法流程

  (1)劃分階段:按照問題的時間或者空間特徵將問題劃分為若干個階段。
  (2)確定狀態以及狀態變量:將問題的不同階段時期的不同狀態描述出來。
  (3)確定決策並寫出狀態轉移方程:根據相鄰兩個階段的各個狀態之間的關係確定決策。
  (4)尋找邊界條件:一般而言,狀態轉移方程是遞推式,必須有一個遞推的邊界條件。
  (5)設計程序,解決問題

實戰練習

下面的三道算法題都是來源於 LeetCode 上與股票買賣相關的問題 ,我們按照 動態規劃 的算法流程來處理該類問題。

股票買賣這一類的問題,都是給一個輸入數組,裏面的每個元素表示的是每天的股價,並且你只能持有一支股票(也就是你必須在再次購買前出售掉之前的股票),一般來說有下面幾種問法:

  • 只能買賣一次
  • 可以買賣無數次
  • 可以買賣 k 次

需要你設計一個算法去獲取最大的利潤。

買賣股票的最佳時機

題目來源於 LeetCode 上第 121 號問題:買賣股票的最佳時機。題目難度為 Easy,目前通過率為 49.4% 。

題目描述

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。

如果你最多只允許完成一筆交易(即買入和賣出一支股票),設計一個算法來計算你所能獲取的最大利潤。

注意你不能在買入股票前賣出股票。

示例 1:

輸入: [7,1,5,3,6,4]
輸出: 5
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。
     注意利潤不能是 7-1 = 6, 因為賣出價格需要大於買入價格。

示例 2:

輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。

題目解析

我們按照動態規劃的思想來思考這道問題。

狀態

買入(buy)賣出(sell) 這兩種狀態。

轉移方程

對於買來說,買之後可以賣出(進入賣狀態),也可以不再進行股票交易(保持買狀態)。

對於賣來說,賣出股票后不在進行股票交易(還在賣狀態)。

只有在手上的錢才算錢,手上的錢購買當天的股票后相當於虧損。也就是說當天買的話意味着損失-prices[i],當天賣的話意味着增加prices[i],當天賣出總的收益就是 buy+prices[i]

所以我們只要考慮當天買和之前買哪個收益更高,當天賣和之前賣哪個收益更高。

  • buy = max(buy, -price[i]) (注意:根據定義 buy 是負數)
  • sell = max(sell, prices[i] + buy)

邊界

第一天 buy = -prices[0], sell = 0,最後返回 sell 即可。

代碼實現

class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length <= 1)
            return 0;
        int buy = -prices[0], sell = 0;
        for(int i = 1; i < prices.length; i++) {
            buy = Math.max(buy, -prices[i]);
            sell = Math.max(sell, prices[i] + buy);

        }
        return sell;
    }
}

買賣股票的最佳時機 II

題目來源於 LeetCode 上第 122 號問題:買賣股票的最佳時機 II。題目難度為 Easy,目前通過率為 53.0% 。

題目描述

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。

設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支股票)。

注意:你不能同時參与多筆交易(你必須在再次購買前出售掉之前的股票)。

示例 1:

輸入: [7,1,5,3,6,4]
輸出: 7
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
     隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。

示例 2:

輸入: [1,2,3,4,5]
輸出: 4
解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接連購買股票,之後再將它們賣出。
     因為這樣屬於同時參与了多筆交易,你必須在再次購買前出售掉之前的股票。

示例 3:

輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。

題目解析

狀態

買入(buy)賣出(sell) 這兩種狀態。

轉移方程

對比上題,這裏可以有無限次的買入和賣出,也就是說 買入 狀態之前可擁有 賣出 狀態,所以買入的轉移方程需要變化。

  • buy = max(buy, sell – price[i])
  • sell = max(sell, buy + prices[i] )

邊界

第一天 buy = -prices[0], sell = 0,最後返回 sell 即可。

代碼實現

class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length <= 1)
            return 0;
        int buy = -prices[0], sell = 0;
        for(int i = 1; i < prices.length; i++) {
            sell = Math.max(sell, prices[i] + buy);
            buy = Math.max( buy,sell - prices[i]);
        }
        return sell;
    }
}

買賣股票的最佳時機 III

題目來源於 LeetCode 上第 123 號問題:買賣股票的最佳時機 III。題目難度為 Hard,目前通過率為 36.1% 。

題目描述

給定一個數組,它的第 i 個元素是一支給定的股票在第 i 天的價格。

設計一個算法來計算你所能獲取的最大利潤。你最多可以完成 兩筆 交易。

注意: 你不能同時參与多筆交易(你必須在再次購買前出售掉之前的股票)。

示例 1:

輸入: [3,3,5,0,0,3,1,4]
輸出: 6
解釋: 在第 4 天(股票價格 = 0)的時候買入,在第 6 天(股票價格 = 3)的時候賣出,這筆交易所能獲得利潤 = 3-0 = 3 。
     隨後,在第 7 天(股票價格 = 1)的時候買入,在第 8 天 (股票價格 = 4)的時候賣出,這筆交易所能獲得利潤 = 4-1 = 3 。

示例 2:

輸入: [1,2,3,4,5]
輸出: 4
解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。   
     注意你不能在第 1 天和第 2 天接連購買股票,之後再將它們賣出。   
     因為這樣屬於同時參与了多筆交易,你必須在再次購買前出售掉之前的股票。

示例 3:

輸入: [7,6,4,3,1] 
輸出: 0 
解釋: 在這個情況下, 沒有交易完成, 所以最大利潤為 0。

題目解析

這裏限制了最多兩筆交易。

狀態

第一次買入(fstBuy)第一次賣出(fstSell)第二次買入(secBuy)第二次賣出(secSell) 這四種狀態。

轉移方程

這裏最多兩次買入和兩次賣出,也就是說 買入 狀態之前可擁有 賣出 狀態,賣出 狀態之前可擁有 買入 狀態,所以買入和賣出的轉移方程都需要變化。

  • fstBuy = max(fstBuy , -price[i])
  • fstSell = max(fstSell,fstBuy + prices[i] )
  • secBuy = max(secBuy ,fstSell -price[i]) (受第一次賣出狀態的影響)
  • secSell = max(secSell ,secBuy + prices[i] )

邊界

  • 一開始 fstBuy = -prices[0]
  • 買入后直接賣出,fstSell = 0
  • 買入后再賣出再買入,secBuy - prices[0]
  • 買入后再賣出再買入再賣出,secSell = 0

最後返回 secSell 。

代碼實現

class Solution {
    public int maxProfit(int[] prices) {
        int fstBuy = Integer.MIN_VALUE, fstSell = 0;
        int secBuy = Integer.MIN_VALUE, secSell = 0;
        for(int i = 0; i < prices.length; i++) {
            fstBuy = Math.max(fstBuy, -prices[i]);
            fstSell = Math.max(fstSell, fstBuy + prices[i]);
            secBuy = Math.max(secBuy, fstSell -  prices[i]);
            secSell = Math.max(secSell, secBuy +  prices[i]); 
        }
        return secSell;

    }
}

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

美西岸漁場重新開放 拖網漁船罕見獲環團肯定

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

繼 YouBike 之後 台北市擬推電動機車租借

台北市政府擬比照 YouBike 模式,推動智慧電動車 U CAR,台北市長柯文哲昨拋出推行電動機車(U Moto)政策,預計在信義計畫區試辦。北市交通局長鍾慧諭說,目前已在全市規劃 20 多個公有停車場空間,作為電動機車充電站,且不侷限信義區,而是各區全面拓點,最快明年上路。   柯文哲說,前天跟產業界討論後得出結論,YouBike 實施之後,可進一步推動電動摩托車,至於 U CAR 則需有足夠經濟規模,將等幾千戶公共住宅成立時再處理。 鍾慧諭表示,共享運具是交通局的重要政策方向,由政府帶頭推動 U Moto,一來改善停車位供給不足問題,二來扶植產業,創造新的服務形態。   鍾慧諭說,U Moto 營運模式與 YouBike 類似,以悠遊卡登記租借,但 YouBike 是政府帶頭做,U Moto 電動摩托車則由民間企業驅動,市府角色為扶植、監理者,目前已與GOGORO、台灣城市動力公司接洽合作,由市府提供公有停車場、路邊停車格作為電池充電站,已規劃出廿多個據點,分布北市各區。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

特斯拉休旅車 Model X Signarue 9 月 29 日開始交車

美國電動車大廠特斯拉(Tesla)於 9 月 2 日宣布,第一部豪華電動跨界車款 Model X Signarue 系列訂 9 月 29 日開始交車。Model X 早在 2012 年初就已用概念車的形式發表,但交車時間一延再延。特斯拉發言人說,這款車的售價約在 13.2 萬到 14.4 萬美元之間。   特斯拉執行長穆斯克在推特上表示,第一批生產的車輛將在 29 日當天於加州 Fremont 廠交車。而較平價的 Model 3 則將於 2 年後開始生產。   限定版的 Signature 系列車,車身將有 Model X 所沒有的獨特紅,還有自動停車和升級的音效設備等。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

java基礎階段幾個必會面試題

1.說出你對面向對象的理解

       在我理解,面向對象是向現實世界模型的自然延伸,這是一種“萬物皆對象”的編程思想。在現實生活中的任何物體都可以歸為一類事物,而每一個個體都是一類事物的實例。面向對象的編程是以對象為中心,以消息為驅動,所以程序=對象+消息。
       面向對象有三大特性,封裝、繼承和多態。
       封裝就是將一類事物的屬性和行為抽象成一個類,使其屬性私有化,行為公開化,提高了數據的隱秘性的同時,使代碼模塊化。這樣做使得代碼的復用性更高。
       繼承則是進一步將一類事物共有的屬性和行為抽象成一個父類,而每一個子類是一個特殊的父類–有父類的行為和屬性,也有自己特有的行為和屬性。這樣做擴展了已存在的代碼塊,進一步提高了代碼的復用性。
       如果說封裝和繼承是為了使代碼重用,那麼多態則是為了實現接口重用。多態的一大作用就是為了解耦–為了解除父子類繼承的耦合度。如果說繼承中父子類的關係式IS-A的關係,那麼接口和實現類之之間的關係式HAS-A。簡單來說,多態就是允許父類引用(或接口)指向子類(或實現類)對象。很多的設計模式都是基於面向對象的多態性設計的。

2.JVM的內存區及其GC算法

參考:

元空間:jdk1.8取消了持久代新增了元空間,並將方法區放在元空間中

3.集合框架下的各種接口和實現類有哪些,分別有啥特點

參考:

4.string類有啥特點,有哪些常用的API

1.String類對象的相等判斷使用equals()方法完成,“==”實現的是地址數值的比較
2.字符串內容一旦聲明則不可改變,String類對象內容的改變是依靠引用關係的變更實現的。
3.String類有兩種實例化方式,使用直接賦值可以不產生垃圾空間,並且可以自動入池,不要使用構造方法賦值。

一些常見API:

 indexOf():檢索字符串中某個字符或某段字符的下標。

lastIndexOf():和indexOf類似,不過是查找最後一個出現的位置。

str.lastIndexOf(str,index):從下標index往前查找最後一個出現的位置

substring():返回一個字符串的子字符串

charAt(index):返回下標對應的字符

trim():去掉字符串前後的空格

startsWith()/endsWith():檢測字符串是否已制定字符串開頭或結尾,返回值是boolean

split()/根據括號內的字符串分離字符串,返回值是一個字符串數組

….

5.stringBuilder和stringBuffer的區別?

運行速度:StringBuilder >StringBuffer >String
線程安全:StringBuilder是線程不安全的,而StringBuffer是線程安全的
String:適用於少量的字符串操作的情況
StringBuilder:適用於單線程下在字符緩衝區進行大量操作的情況
StringBuffer:適用多線程下在字符緩衝區進行大量操作的情況

為什麼StringBuilder是不安全的?

下面是StringBuilder 的append方法源碼

char[] value;
int count;
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}

對於count + =len;不是一個原子操作 兩個線程同時執行假設都是 計數器為 10 執行完后 就會變成11 而不是12

什麼是原子操作:

 簡單的例子:
       轉賬,A轉給B100,因為停電,導致A轉出了100,B卻沒收到100,所以要把100回滾給A。
原子操作就是多線程下各線程同時執行失敗且同時成功,在兩個線程下,由於count繼承於父類AbstractStringBuilder,當
其中一個線程對coun執行+len后,另一線程取到的count值仍為原來的count值,故+len后和上一個線程得到的結果一樣,
故線程不安全
而stringBuffer中源碼:

@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}

當一個線程訪問append後會立即上鎖,從而另一個線程無法訪問append方法,故是線程安全的
在多線程下,stringBuffer下各線程需要頻繁的加鎖解鎖操作,從而需要運行更長的時間,雖然stringBuilder不需要加鎖解鎖,
但由於線程不安全性,更適用於單線程。

6.線程創建的3種方式,線程阻塞的API有哪些及其之間的區別?

Runnable,Thread,通過 Callable 和 Future 創建線程三種方式

1. 繼承Thread類來創建一個線程, 並實現run方法(線程需要完成的功能); 構建子類對象,start()啟動線程
2. 實現Runnable接口來創建一個線程, 實現Runnable,實現run()方法; 將Runnable接口類的對象作為參數傳遞給Thread類對象, 並調用start()方法;
3. 實現Callable接口來創建一個線程, 先定義一個Callable的實現類, 重寫call()方法, call()有返回值; 兩種執行方式:
1). 藉助FutureTask執行, 創建Callable實現類的對象, 並作為參數傳遞給FutureTask, FutureTask作為參數傳遞給Thread類的對象, 並執行start()方法;
2). 藉助線程池來執行, 先創建線程池, 然後調用線程池的submit方法, 並將Callable實現列作為參數傳入

方法二的好處:
1. 可以將一個Runnable實現類傳遞給多個線程對象, 適合用多個相同程序代碼的編程處理同一個資源
2. Thread類創建線程是採用繼承的方式, 而Java中只能單繼承, 如果某個子類的需要創建線程只能採用實現Runnable接口或者實現Callable接口的方式.

方法三的好處:
1. 有返回值
2. call()可以拋出異常
3. 運行Callable任務可以得到一個Future兌現,表示異步計算的結果. 它提供了檢測計算是否完成的方法(isDone())以等待計算的完成,並檢索計算的結果.

線程阻塞api:

sleep()方法;:該方法允許指定以ms為單位的一段時間作為參數, 它使得線程在指定的時間內進入阻塞狀態,不能得到CPU時間, 指定時間已過,線程重新進入可執行狀態.
suspend()和resume()方法:配套使用, suspend()使得線程進入阻塞狀態,且不會自動恢復, 必須將其對應的resume()調用, 才可以使線程進入可執行狀態.
yield();:使得線程放棄當前分得的CPU時間, 但是不使線程阻塞, 即線程仍然處於可執行狀態;
wait()和notify()方法:配套使用,若wait()有參數,相當於sleep(但可以通過notify強行喚醒), wait()沒有參數,相當於suspend(), 需要通過notify喚醒

sleep(0)和sleep(1)和不要sleep的區別

sleep(0),如果線程調度器的可運行隊列中有大於或等於當前線程優先級的就緒線程存在,操作系統會將當前線程從處理器上移除,調度其他優先級高的就緒線程運行;如果可運行隊列中的沒有就緒線程或所有就緒線程的優先級均低於當前線程優先級,那麼當前線程會繼續執行,就像沒有調用 Sleep(0)一樣。
Sleep(1),會引發線程上下文切換:調用線程會從線程調度器的可運行隊列中被移除一段時間,這個時間段約等於 timeout 所指定的時間長度。為什麼說約等於呢?是因為睡眠時間單位為毫秒,這與系統的時間精度有關。通常情況下,系統的時間精度為 10 ms,那麼指定任意少於 10 ms但大於 0 ms 的睡眠時間,均會向上求值為 10 ms。

7.抽象類和接口的區別?有了抽象類為啥還要接口?

1.一類可以實現多個接口但只能繼承自一個抽象類,從抽象類派生出的子類同樣可以實現接口,從而,我們能得出一個結論:接口是為Java實現多繼承而存在的
2.抽象類中可以存在非抽象的方法,可接口不能存在非抽象的方法,並且接口裡面的方法只是一個聲明,必須用 public abstract來修飾,沒有具體的實現
3.抽象方法中的成員變量可以被不同的修飾符修飾,而接口中的成員變量默認都是靜態常量
4.抽象類是對對象進行的抽象,而接口是一種行為規範,這一點是比較重要的.
(所以為什麼有了接口還要有抽象類)

8.冒泡排序,選擇排序,快速排序(了解)

冒泡排序:什麼是冒泡?比如說水底隨機產生一些氣泡,一起往上冒泡,越輕的氣泡往上冒的越快
具體:12 34 10 78 67
如果從小到大排序:先將67和78比較,67比78小,依次往前比較,小的放前面,打的放後面,以此為一輪排序,然後再將新的數組重複上述過程,共需要n輪排序(n為元素個數);

選擇排序:從一個數組裡選出最小的元素放在數組第一位並交換位置,然後再將去掉第一位的數組找出最小元素並放在這個新數組第一位,
重複此操作。
12 34 10 78 67
第一輪:10| 34 12 78 67
第二輪:10 12| 34 78 67
第三輪:10 12 34| 78 67
第四輪:10 12 34 67| 78
排序結束

快速排序:基於基數排序。先取任意一基數,一般為數組第一個元素(由於當第一個元素為最小值(最大值)時會使排序出現錯誤,故有時候也取中間的元素),然後將比基數小的數作為一個數組,比基數大的數作為一個數組,再將新的兩個數組分別遞歸排序。
通過基數分成兩個數組的過程:12 34 10 78 67 8 假設數組為arr
取一基數temp=12 取low=0(數組第一位),high=5(數組最後一位)
第一輪:第一步:先從后往前比較:arr[high]=8<12=temp,結束這一步操作,high與low不變。如果這裏arr[high]>12,則令high-1得到新的high將arr[high]與temp比較,依此下去直到arr[high]<temp,這種情況high發生改變,low不變。
第二步:再從前往後將arr[low]與temp比較,原理與第一步相同,因為arr[1]>temp,此時low=1,結束這一步操作。
第三步:交換arr[low]與arr[high]的值
第一輪結果:12 8 10 78 67 34(low=1,high=5)
第二輪:與第一輪一樣,第一步,從arr[high]往前,直到arr[2]=10<12,此時high=2,結束這一步
第二步,從arr[low]往後,12,8,10都不大於12,到這裏的時候,因為low=2=high,故比較,得到索引index=low=high=2
第二輪結果:12 8 10 78 67 34
因為index得到了值3,將arr[index]作為分界點將最後一輪結果數組[12 8 10 78 67 34]分為兩個數組[12 8 10]和[78 67 34]
將新的到的兩個數組重複進行上述操作
[12 8 10]->因為12為最大值,故取中間值8->[8]和[10 12]->[8]、[10]、[12]
[78 67 34]->取67,->[34]、[67 78]->[34]、[67]、[78]->[8]、[10]、[12]、[34]、[67]、[78]
(拓展:希爾排序、插入排序)

9.什麼是死鎖?如何避免死鎖

死鎖的定義:所謂死鎖是指多個線程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。

產生原因:
1) 系統資源的競爭
通常系統中擁有的不可剝奪資源,其數量不足以滿足多個進程運行的需要,使得進程在 運行過程中,會因爭奪資源而陷入僵局,如磁帶機、打印機等。只有對不可剝奪資源的競爭 才可能產生死鎖,對可剝奪資源的競爭是不會引起死鎖的。
2) 進程推進順序非法
進程在運行過程中,請求和釋放資源的順序不當,也同樣會導致死鎖。例如,併發進程 P1、P2分別保持了資源R1、R2,而進程P1申請資源R2,進程P2申請資源R1時,兩者都 會因為所需資源被佔用而阻塞。

四個產生死鎖的條件:
互斥條件:進程要求對所分配的資源(如打印機)進行排他性控制,即在一段時間內某 資源僅為一個進程所佔有。此時若有其他進程請求該資源,則請求進程只能等待。
不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能 由獲得該資源的進程自己來釋放(只能是主動釋放)。
請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源 已被其他進程佔有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。
循環等待條件:存在一種進程資源的循環等待鏈,鏈中每一個進程已獲得的資源同時被 鏈中下一個進程所請求。即存在一個處於等待狀態的進程集合{Pl, P2, …, pn},其中Pi等 待的資源被P(i+1)佔有(i=0, 1, …, n-1),Pn等待的資源被P0佔有。

避免死鎖:
1.加鎖順序(線程按照一定的順序加鎖)
2.加鎖時限(線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己佔有的鎖)
3.死鎖檢測
參考:

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

transformer模型簡介

Transformer模型由《Attention is All You Need》提出,有一個完整的Encoder-Decoder框架,其主要由attention(注意力)機制構成。論文地址:。

其整體結構如圖所示:

 

模型分為編碼器(Encoder)和解碼器(Decoder)兩部分,包含內部結構的總體結構如下圖所示:

 

                                                      圖二

在論文中編碼器部分由6個相同編碼器疊在一起,解碼器部分也是由6個相同解碼器疊在一起,編碼器之間不共享參數。(這裏不一定要是6個)

在將詞向量表示送入編碼器、解碼器之前,先做positional encoding,下面依次對positional encoding、encoding、decoding進行介紹:

1、positional encoding

 

 

如圖所示,由於attention機制不包含位置信息,因此句子首先進行embedding得到詞向量表示,同時為了增加位置信息,根據句子中詞的位置信息給詞嵌入添加位置編碼向量,論文中添加位置編碼的方法是:構造一個跟輸入embedding維度一樣的矩陣,然後跟輸入embedding相加得到multi-head attention 的輸入。

作者希望引入絕對位置的編碼公式,讓模型能夠學習到相對位置信息,作者使用的positional encoding生成固定位置表示如下:

已知三角函數公式如下:

 

 

 作者希望通過絕對位置的編碼公式,讓模型可以學習到相對位置信息。雖然如此獲得的 position embeddings,兩者之間的點積能夠反應相對距離,但它缺乏方向性,並且這種特性(相對距離)會被原始 Transformer 的注意力機制破壞。

基於公式 (1),位置t的位置嵌入可以表示為:

 

 

 

 

 

 

2、encoding

如圖二左邊結構所示,編碼器主要由前饋神經網絡層與多頭自注意力層構成,值得注意的是,在每個編碼器中的每個子層(自注意力、前饋網絡)的周圍都有一個殘差連接,並且都跟隨着一個“層-歸一化”步驟。這裏先介紹attention機制,還是舉個栗子:

假設我們想要翻譯這個句子:

“The animal didn’t cross the street because it was too tired”

那麼it在這句話中是是指animal還是street,人類好理解這句話,但是對機器來說就很困難了。當模型處理這個單詞“it”的時候,自注意力機制會允許“it”與“animal”建立聯繫。隨着模型處理輸入序列的每個單詞,自注意力會關注整個輸入序列的所有單詞,幫助模型對本單詞更好地進行編碼。如下圖。

 

當我們在編碼器#5(棧中最上層編碼器)中編碼“it”這個單詞的時,注意力機制的部分會去關注“The Animal”,將它的表示的一部分編入“it”的編碼中。

接下來介紹attention實現的思想。

計算自注意力的第一步就是從每個編碼器的輸入向量(每個單詞的詞向量)中生成三個向量。也就是說對於每個單詞,我們創造一個查詢向量、一個鍵向量和一個值向量。這三個向量是通過詞嵌入與三個權重矩陣后相乘創建的。在論文中這三個向量的維度比詞嵌入向量要低,實際中維度更低不是必須的,只是架構上的選擇,可以使多頭注意力的大部分計算保持不變。

計算自注意力的第二步是計算得分。假設我們需要對第一個詞’Thinking’計算自注意力向量那麼需要拿輸入句子中的每個單詞對“Thinking”打分。這些分數決定了在編碼單詞“Thinking”的過程中有多重視句子的其它部分。

這些分數是通過打分單詞(所有輸入句子的單詞)的鍵向量與“Thinking”的查詢向量相點積來計算的。所以如果我們是處理位置最靠前的詞的自注意力的話,第一個分數是q1和k1的點積,第二個分數是q1和k2的點積。

 

第三步和第四步是將分數除以8(8是論文中使用的鍵向量的維數64的平方根,這會讓梯度更穩定。這裏也可以使用其它值,8隻是默認值),然後通過softmax傳遞結果。softmax的作用是使所有單詞的分數歸一化,得到的分數都是正值且和為1。

 

這個softmax分數決定了每個單詞對編碼當下位置(“Thinking”)的貢獻。顯然,已經在這個位置上的單詞將獲得最高的softmax分數,但有時關注另一個與當前單詞相關的單詞也會有幫助。

第五步是將每個值向量乘以softmax分數(這是為了準備之後將它們求和)。這裏的直覺是希望關注語義上相關的單詞,並弱化不相關的單詞。

第六步是對加權值向量求和,然後即得到自注意力層在該位置的輸出。

 

這樣自注意力的計算就完成了。得到的向量就可以傳給前饋神經網絡。

在現實中自注意力機制是通過矩陣來實現的,與上面思路一樣:

第一步是計算查詢矩陣、鍵矩陣和值矩陣,如下圖所示:

 

將前面的計算步驟可以合併成:

 

介紹完自注意力機制后,介紹在論文中使用的多頭自注意力機制“multi-headed” attention。

 

每個頭都是獨立的查詢/鍵/值權重矩陣,從而產生不同的查詢/鍵/值矩陣。在論文中採用的是8頭,那麼經過8次不同權重矩陣運算,我們會得到8個不同的Z矩陣。

 

然後我們將這8個矩陣壓縮成一個矩陣,實現原理是將這8個矩陣拼接在一起,然後再用一個權重矩陣與之相乘,得到一個融合所有注意力頭信息的矩陣Z,再將其求和與歸一化後傳給前饋層。

 

Decoding(解碼器):

解碼器內部組件與編碼器大同小異,需要注意的是,解碼器的第一個注意力層被稱作MaskedMulti-Head Attention,通過加入了MASK操作,使得我們只被允許處理輸出序列中更靠前的那些位置,即我們只能attend到前面已經處理過的語句。第二個注意力層被稱作encoder-decoder attention layer,由圖二可知,它的query來自前一級的decoder層的輸出,key、value來自encoder的輸出,encoder的輸出可以幫助解碼器關注輸入序列哪些位置合適。接下來送入前饋層,然後重複這些步驟,直到到達一個特殊的終止符號,它表示transformer的解碼器已經完成了它的輸出。每個步驟的輸出在下一個時間步被提供給底端解碼器,並且就像編碼器之前做的那樣,這些解碼器會輸出它們的解碼結果 。另外,就像我們對編碼器的輸入所做的那樣,我們會嵌入並添加位置編碼給那些解碼器,來表示每個單詞的位置。

 

在解碼完成後會輸出一個實數向量,經過一個簡單的全連接神經網絡(線性變換層)映射到一個被稱作對數幾率(logits)的向量里,假設從訓練集中學習一萬個單詞,那麼對數幾率向量為一萬個單元格長度的向量——每個單元格對應某一個單詞的分數。接下來的Softmax 層便會把那些分數變成概率(都為正數、上限1.0)。概率最高的單元格被選中,並且它對應的單詞被作為這個時間步的輸出。

 

 

 參考:

   

           

         

 

 

(完)

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

南投搬家前需注意的眉眉角角,別等搬了再說!

降空污 國際級船舶新規2020上路 燃油含硫量最多0.5% 違規將受罰

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

日本研究:暖化可能使颱風速度減慢而更易致災

摘錄自2020年1月9日中央社報導

日本一項研究顯示,地球若持續暖化,經過日本附近的颱風行進速度將比現在慢約10%;颱風行進速度減慢,將拉長強風大雨影響時間,也就更可能造成淹水及土石崩落等災情。

日本朝日新聞報導,日本氣象廳氣象研究所等組成團隊公布一項預測結果,並已刊載在國際頂尖期刊「自然通訊」(Nature Communications)上。

氣象研究所主任研究官山口宗彥等人,假設本世紀末地球平均氣溫已較第一次工業革命前高出攝氏4度(目前約高3度),利用電腦進行氣候變化的演算。

結果顯示,受到日本上空西風帶被往北推升等影響,颱風的行進方向與速度也會發生變化,經過日本列島周邊的平均時速會減慢約10%。山口說,颱風行進速度一旦減緩,降雨量將更為增加,提升造成重大災情的風險。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!