-
Prefix Sums – GenomicRangeQuery解題紀錄
Continue Reading…: Prefix Sums – GenomicRangeQuery解題紀錄題目內容 題目頁面: https://app.codility.com/programmers/lessons/5-prefix_sums/genomic_range_query/ 題目理解 天啊~我最討厭有故事性的題目了如汽車或DNA,好長阿~~~讓我認真看他在說啥! DNA和factor可表示為: {‘A’:1,’C’:2,’G’:3,’T’:4},S = CAGCCTA,P=[2,5,0],Q=[4,5,6] 然後要找第 K 個查詢(0 ≤ K < M),找到 P[K] 和 Q[K](含)之間的 DNA 序列中包含的核苷酸的最小影響因子。也就是要計算出一個長度為M(M為P、Q的長度)的陣列,然後返回最小影響因子 例如M[0] = Math.min(S[2],S[3]) = Math.min(‘G’,’C’) = Math.min(2,3) =2 陷阱在這: each element of arrays P and Q is an integer within…
-
Prefix Sums – CountDiv解題紀錄
Continue Reading…: Prefix Sums – CountDiv解題紀錄題目內容 題目頁面: https://app.codility.com/programmers/lessons/5-prefix_sums/count_div/ 解題思路 給定三個整數 A、B 和 K,返回 [A..B] 範圍內可被 K 整除的整數個數,且A 和 B 是 [ 0 .. 2,000,000,000 ]範圍內的整數; K 是 [ 1 .. 2,000,000,000 ]範圍內的整數。 嗯…看起來這是一題用效能卡死人的題目,因為最大值可到2,000,000,000,但是為了求正確性,我們還是先從簡單的方法寫起,再來慢慢改善效能,不要一下想太難的方法。先把暴力破解法寫出來 但是有了上次的經驗,我根本不想送出這個答案被打槍。所以先來想改善方法,首先,我想找到比A大,最小能夠被整除的數字,和比B小最大能夠被整除的數字然後相減後直接除以K 結果!!甚麼!!!中等程度這麼快解決!!太棒了!!!https://app.codility.com/demo/results/trainingCYGC6K-3H8/
-
Prefix Sums(前綴和)概念
Continue Reading…: Prefix Sums(前綴和)概念甚麼是Prefix Sums(前綴和) 當需要快速查詢數組中某一區間的元素和時,Prefix Sums可以幫助我們在O(1)的時間複雜度內進行查詢。 具體做法是先對數組進行預處理,計算出從第一個元素到當前位置的所有元素的和,然後通過兩個元素的前綴和之差來計算出任意區間的元素和。例如,要查詢數組中第i到第j個元素的和,只需要計算sums[j+1] – sums[i]即可。 Prefix Sums通常用於需要頻繁查詢數組中某一區間的元素和的情況,例如在數學、統計學、計算機科學和機器學習等領域中。Prefix Sums的計算可以在預處理的階段中完成,因此可以在之後的查詢中以O(1)的時間複雜度快速地回答各種區間求和問題。 例如,在計算機科學中,Prefix Sums通常用於解決數組中的區間查詢問題,例如求解區間最大子段和、區間平均值、區間中位數等。Prefix Sums還可以用於在數據壓縮、圖像處理和信號處理等領域中,進行離散化、濾波和卷積等操作。 計算出從第一個元素到當前位置的所有元素的和,是因為這樣可以在之後的區間求和操作中,通過兩個元素的前綴和之差來快速計算任意區間的元素和。例如,要查詢數組中第i到第j個元素的和,只需要計算sums[j+1] – sums[i]即可。這樣可以大大降低區間求和操作的時間複雜度,提高算法效率。 Prefix Sums使用時機 在許多需要進行區間求和操作的問題中,Prefix Sums都是一種常用的解決方案。因此,在識別哪些問題需要使用Prefix Sums時,可以考慮以下幾點: 綜合以上幾點,可以初步判斷哪些問題可能需要使用Prefix Sums。在實際應用中,還需要進一步評估和優化算法,以確保其效率和準確性。 使用Binary Indexed Tree來計算前綴和 BIT的基本思想是將原始數組轉換為一個二進制表示的數組,並在其中儲存一些特定位置的前綴和。BIT的建立和查詢操作都可以在O(n log n)的時間複雜度內完成,其中n是數組的長度。BIT的更新操作可以在O(log n)的時間複雜度內完成。 更多詳細介紹: https://yuihuang.com/binary-indexed-tree/ 範例題目 – PassingCars 題目連結 https://app.codility.com/programmers/lessons/5-prefix_sums/passing_cars/ 我的第一次解法(javascript) 成績如下,雖然答案是正確的,但是效率不夠,為O(N**2),只拿到70%的分數 改善方向…
-
Counting Elements
Continue Reading…: Counting Elements概念介紹 Counting Elements是一種計算數組中元素出現次數的概念。它通常用於解決一些與計數有關的問題,例如找出數組中出現次數超過一定閾值的元素,計算數組中不同元素的個數等。 在Counting Elements中,我們可以使用一個額外的數組counts,將數組中每個元素出現的次數記錄下來。counts[i]表示數組中元素i出現的次數,如果數組中不存在元素i,則counts[i]=0。 具體來說,Counting Elements算法的步驟如下: Counting Elements算法的時間複雜度為O(n),其中n是數組的長度。它可以在線性時間內計算數組中元素的出現次數,因此非常適用於需要頻繁計算元素次數的問題。另外,Counting Elements算法還可以與其他算法結合使用,例如快速排序和二分查找等,以進一步優化計算效率。 使用時機 在許多與計數有關的問題中,Counting Elements是一種常見的解決方案。因此,在考慮使用Counting Elements時,可以考慮以下幾點: 綜合以上幾點,可以初步判斷哪些問題可能需要使用Counting Elements。在實際應用中,還需要進一步評估和優化算法,以確保其效率和準確性。 練習題目1 題目連結: FrogRiverOne – VIEW 我的解法 測試通過,為100%! 練習題目2 題目連結: PermCheck – VIEW 我的作答 練習題目3- MaxCounters 題目連結: MaxCounters – VIEW 我的解法 結果正確,但時間超時,只得到66的分數,代表需要再修改做法 我檢查了一下寫法,發現arr.fill(max_value)這行雖然只有一行,但是會是O(N)的複雜度,會增加許多的時間複雜度,因此,我嘗試最後再一次性的更新這個值,並且在每一步做加總時,檢查這個值是否需要被更新,就可以避免每次當A[i]>N時都得增加一次O(N)的時間複雜度。 https://app.codility.com/demo/results/training556V6C-HBV/ 練習題目4- MissingInteger…
-
時間複雜度BigO介紹
Continue Reading…: 時間複雜度BigO介紹什麼是BigO 時間複雜度是指算法所需的運行時間與輸入數據規模之間的關係。在計算機科學中,我們使用 BigO 表示法來表示算法的時間複雜度。 BigO 表示法中的 O 代表 “on the order of”,即算法的運行時間隨著輸入規模的增長,按照某種數量級的速度增長。常見的時間複雜度從低到高分別是 O(1)、O(log n)、O(n)、O(n log n)、O(n^2)、O(2^n) 和 O(n!)。 在實際應用中,我們通常希望選擇時間複雜度盡可能低的算法。然而,不同的算法在不同的應用場景下可能表現不同,因此選擇合適的算法需要根據具體問題進行綜合考慮。 另外需要注意的是,時間複雜度只是對算法的一個粗略估計,實際運行時間還受到很多其他因素的影響,如輸入數據的特性、計算機硬件性能等。因此,在實際應用中需要進行充分的測試和優化,以獲得更準確的運行時間估計。 降低常數 在 BigO 表示法中,常數因子通常被省略,因為它們對算法的增長速度影響相對較小。在特定輸入下O(N)可能會比O(1)更小,一般來說,BIG O只是在描述增加的速率。 降低非優勢條件 在算法的時間複雜度分析中,我們通常會關注最壞情況下的時間複雜度,即算法在處理最壞情況下的輸入時所需的時間複雜度。但是,在實際應用中,算法所處理的輸入可能並不總是最壞情況,因此可能存在一些非優勢條件,即輸入規模較小、輸入具有特殊性質等情況。 刷題範例 題目連結: https://app.codility.com/programmers/lessons/3-time_complexity/tape_equilibrium/ 我的解答 – https://app.codility.com/demo/results/training5HCTQQ-UW6/ 結果如下
-
Chunked Encoding介紹
Continue Reading…: Chunked Encoding介紹甚麼是Chunked Encoding Chunked encoding(分塊編碼)是一種HTTP/1.1協議中的傳輸編碼方式,用於將HTTP消息主體分成多個塊(chunks),以便在網絡上進行有效傳輸。分塊編碼主要用於動態生成的內容,以及在事先不知道內容大小的情況下傳輸數據。 分塊編碼的工作原理如下: 要使用分塊編碼,服務器需要在HTTP響應頭中設置Transfer-Encoding字段為chunked。這告訴客戶端,接收到的數據將使用分塊編碼格式。 分塊編碼的主要優點是允許服務器在不知道最終內容大小的情況下開始傳輸數據。這對於動態生成的內容、實時數據流和大文件傳輸非常有用。此外,分塊編碼還可以實現數據的即時壓縮和傳輸,從而提高傳輸效率。 設定nginx以支持Chunked Encoding 以下是一個簡單的nginx.conf範例,用於支持在http://127.0.0.1/live下的文件開啟chunked encoding。此配置檔案會將請求代理到後端應用伺服器(例如:Node.js、Python或其他後端應用)進行處理。請注意,這裡假設後端應用伺服器已經正確配置並支持分塊編碼。 這個配置檔案將Nginx設置為代理位於http://127.0.0.1/live的請求,並將請求轉發到後端應用伺服器。在location /live部分,使用chunked_transfer_encoding on;指令開啟分塊編碼。 觀察你的檔案是否有啟用Chunked Encoding 我們可以從伺服器的回應看到這個伺服器的檔案傳輸是否有支持Chunked Encoding,如下圖
-
CMAF – 媒體封裝格式介紹
Continue Reading…: CMAF – 媒體封裝格式介紹CMAF介紹(Common Media Application Format) CMAF(Common Media Application Format,通用媒體應用格式)是一種專為網絡媒體傳輸設計的標準。CMAF旨在簡化不同裝置和網絡環境之間的媒體流適配和交付,從而提高流媒體的性能和覆蓋範圍。CMAF是一種媒體封裝格式。CMAF被設計為簡化在不同裝置和網絡環境之間的媒體流適配和交付,從而提高流媒體的性能和覆蓋範圍。CMAF檔案通常具有.cmf或.mp4擴展名。 CMAF(Common Media Application Format,通用媒體應用格式)是一種媒體封裝格式,類似於FLV(Flash Video)和MP4(MPEG-4 Part 14)。CMAF旨在簡化在不同裝置和網絡環境之間的媒體流適配和交付,以提高流媒體的性能和覆蓋範圍。 與FLV和MP4等其他封裝格式相比,CMAF的一個主要優勢在於它的兼容性和靈活性。CMAF可以應對各種不同的網絡環境和裝置能力,並且可以與多種流媒體協議(如HLS和MPEG-DASH)無縫地配合使用。 CMAF的特點 CMAF的主要特點包括: 總之,CMAF是一種簡化網絡媒體傳輸的標準,它有助於提高流媒體的性能、覆蓋範圍和兼容性。 CMAF的延遲 CMAF(Common Media Application Format,通用媒體應用格式)主要用於適配和交付HLS(HTTP Live Streaming)和MPEG-DASH(Dynamic Adaptive Streaming over HTTP)等流媒體協議。CMAF的目標是在不同裝置和網絡環境之間提供高效的媒體流適配和交付,而非專注於低延遲。 由於CMAF依賴於HTTP,其延遲通常會比使用基於UDP的協議(如SRT或RTP)高。HTTP協議需要較長的時間來建立連接、請求和接收數據,這導致了較大的延遲。此外,CMAF通常用於分段媒體流,每個分段的持續時間也會增加延遲。 然而,CMAF的延遲性能可以通過使用CMAF的低延遲模式(CMAF-LLC)來改善。CMAF-LLC使用chunked encoding傳輸技術來實現低延遲,這允許客戶端在接收到完整的媒體分段之前開始解碼和播放。這樣可以將延遲降低到可接受的範圍,但仍然可能高於使用基於UDP的協議,如SRT。 總之,儘管使用CMAF的延遲可能較長,但通過使用CMAF-LLC可以改善延遲性能。然而,對於實時應用或低延遲要求非常嚴格的場景,使用基於UDP的協議,如SRT或RTP,可能是更合適的選擇。
-
使用Helm來部署K8S
Continue Reading…: 使用Helm來部署K8SHelm介紹 Helm 是一個 Kubernetes 包管理器,它可以幫助您在 Kubernetes 上部署和管理應用程序。Helm 允許您定義、安裝和升級 Kubernetes 應用程序,並且可以管理它們的依賴關係。 Helm 由兩部分組成:Helm CLI 和 Helm Charts。Helm CLI 是一個命令行界面,用於管理 Helm Charts。Helm Charts 是一個包含 Kubernetes 资源描述文件的打包文件,例如 Deployment、Service、Ingress、ConfigMap 等等。這些文件被打包到壹個壓縮文件中,通常是 tar.gz 或 zip 格式。 使用 Helm,您可以通過創建自己的 Charts 或者使用社區提供的 Charts 快速部署應用程序。您可以使用 Helm Charts 定義 Kubernetes…
-
Prometheus Exporter: json-exporter
Continue Reading…: Prometheus Exporter: json-exporter甚麼是JSON Exporter JSON Exporter是一個Prometheus的exporter(指標收集器),它能夠從提供JSON格式的API中收集指標數據,並將這些數據轉換為Prometheus所支持的格式,以便Prometheus進行分析和視覺化。 JSON Exporter的運行方式是通過設置JSON配置文件,其中包括API端點和相關的指標數據,然後使用Prometheus的配置文件將JSON Exporter添加到Prometheus的targets列表中。 JSON Exporter可以收集各種不同類型的指標數據,例如計數器(counters)、量規(gauges)和直方圖(histograms)等,並可以根據需要對數據進行轉換和聚合。 如何設置Exporter 在官方的Writing exporters文件中,有下面這一段 Each exporter should monitor exactly one instance application, preferably sitting right beside it on the same machine. That means for every HAProxy you run, you run a haproxy_exporter process. For…
-
在AWS的EC2裡加上SSL/TSL
Continue Reading…: 在AWS的EC2裡加上SSL/TSLSSL/TSL是甚麼 SSL/TLS是一種網絡協議,用於在客戶端和服務器之間提供安全的數據傳輸。 SSL代表“安全套接字層”,TLS代表“傳輸層安全性”,兩者是相似的協議,TLS是SSL的升級版。 SSL/TLS通過加密數據流來保護通信的隱私和完整性,以防止數據在傳輸過程中被竊聽或篡改。它使用數字證書來驗證服務器身份,以確保連接到的服務器是預期的服務器,而不是惡意者偽裝的服務器。 SSL/TLS廣泛用於保護網站,電子郵件,即時通訊,虛擬專用網絡(VPN)等應用程序中的數據傳輸。通過使用SSL/TLS,這些應用程序能夠提供更安全的通信,確保用戶的數據受到保護。 我的伺服器環境 這邊所說的是自架的Linux服務器的狀況,一般若是在網域託管的服務商買網站空間,使用cPanel等管理網站的狀況下,一般都會在空間購買裡面附設有免費的SSL/TSL證書,除非我們的網站需要額外的附加資訊才需要自行購買。 這篇文章所講的主要是當我們要在Linux裡面自行設定SSL/TSL,或使用AWS、Azure等服務的虛擬機器架設網站時,會需要自行於Linux中建立SSL/TSL並匯入所需的SSL/TSL認證。 在AWS中使用免費的ACM證書 這邊有很詳細的指導: 教學課程: 在 Amazon Linux 2 上設定 SSL/TLS 但是這邊的教程在後面匯入SSL證書的部分,是要我們自己去購買自己網域專屬的證書,那個很貴而且不太能夠免費,一般免費的SSL/TSL其組織等資訊並不會附在上面,如下圖為AWS所提供的免費證書。 要使用免費證書一個重要的前提就是要將我們所購買的網域給AWS的Route 53來託管,這個動作會產生微量的費用,一個月為0.51美金。 在AWS裡面,有一些服務本身就可以直接和Route53,若是沒辦法,則要另外建立 Elastic Load Balancing,這個是免費的,它可以用來連結我們的EC2和Route53,這樣就可以利用ACM來設定憑證了。
Search
About Me
17年資歷女工程師,專精於動畫、影像辨識以及即時串流程式開發。經常組織活動,邀請優秀的女性分享她們的技術專長,並在眾多場合分享自己的技術知識,也活躍於非營利組織,辦理活動來支持特殊兒及其家庭。期待用技術改變世界。
如果你認同我或想支持我的努力,歡迎請我喝一杯咖啡!讓我更有動力分享知識!