大數據面試題之Presto[Trino](3)

目錄

Presto如何處理數據的聚合操作?

Presto支持哪些類型的JOIN操作?

如何在Presto中使用子查詢?

解釋Presto中的窗口函數。

Presto中的Page和Block是什么?

描述Presto如何處理列式存儲數據。

ORC和Parquet格式在Presto中的支持情況如何?

如何在Presto中使用壓縮數據格式?

解釋Presto中的內存管理和數據結構。?

什么情況下Presto的性能會下降?


Presto如何處理數據的聚合操作?

Presto處理數據聚合操作的方式遵循SQL標準,主要通過GROUP BY子句來實現對數據集的分組聚合。以下是Presto處理聚合操作的基本步驟和高級特性:
1、基本聚合操作:
使用GROUP BY關鍵字對數據進行分組,然后應用聚合函數(如SUM, AVG, COUNT, MAX, MIN等)來計算每個組的匯總值。例如,SELECT name, SUM(sales) FROM sales_data GROUP BY name; 將按姓名分組并計算每個人的銷售總額。
2、增強聚合功能:
Presto支持GROUPING SETS, CUBE, 和 ROLLUP 等高級聚合操作,以方便用戶執行多維度分析:
GROUPING SETS 允許用戶指定一組特定的分組組合,相當于執行多個GROUP BY查詢的并集。
ROLLUP 自動生成一系列嵌套的分組,從最細粒度到更高層次的匯總。
CUBE 生成所有可能的分組組合,適用于全維度分析。
3、內存管理與溢出處理:
在執行聚合操作時,Presto會盡可能在內存中完成計算。如果數據量過大導致內存不足,Presto會嘗試使用外部排序或臨時磁盤空間來處理數據溢出,以保證查詢的連續執行。
4、用戶自定義聚合函數(UDAF):
Presto允許用戶開發自定義聚合函數來滿足特定的業務需求。這包括定義輸入函數、合并函數和輸出函數,以處理復雜的數據聚合邏輯。
5、并行處理與分布執行:
聚合操作在Presto中是以并行和分布的方式執行的。查詢被分解成多個任務,分配到不同的worker節點上執行,每個節點處理一部分數據。這大大加速了處理大量數據集的能力。
6、優化與執行計劃:
Presto的查詢優化器會分析聚合查詢,選擇最優的執行計劃,包括但不限于謂詞下推、早期聚合(在讀取數據時就進行部分聚合以減少數據量)等策略,以提高執行效率。
綜上,Presto通過靈活的SQL語法支持、高效的內存管理和并行處理架構,以及對用戶自定義擴展的支持,提供了強大且高效的數據聚合能力。

Presto支持哪些類型的JOIN操作?

Presto支持以下幾種類型的JOIN操作:

  1. Inner Join(內連接):返回兩個表中鍵相匹配的行。
  2. Left Join(左連接):返回左表的所有行,即使在右表中沒有匹配項。對于右表中沒有匹配的行,結果集中右表的部分將為NULL。
  3. Right Join(右連接):與左連接相反,返回右表的所有行,即使在左表中沒有匹配項。對于左表中沒有匹配的行,結果集中左表的部分將為NULL。
  4. Full Outer Join(全外連接):返回左表和右表中所有匹配和不匹配的行。不匹配的行在另一側對應的列值將為NULL。
  5. Cross Join(交叉連接):又稱笛卡爾積,返回左表的每一行與右表的每一行的所有可能組合,不帶任何條件。
  6. Semi Join(半連接):只返回左表中在右表中有匹配項的行,但不包含右表的列。
  7. Anti Join(反連接):返回左表中在右表中沒有匹配項的行。

這些JOIN操作允許用戶靈活地在數據集之間進行關聯分析,滿足不同的查詢需求。值得注意的是,雖然Presto支持這些JOIN操作,但對于多張大表的JOIN,由于其基于內存的計算模型,可能會面臨內存壓力,從而影響性能。因此,在處理大規模數據JOIN時,需要考慮數據分布、表的大小以及內存資源,合理設計查詢和調整系統配置以優化性能。

如何在Presto中使用子查詢?

在Presto中,子查詢是一種常見的SQL構造,用于在主查詢內部嵌套另一個查詢,以實現更復雜的邏輯。子查詢可以出現在SELECT、FROM、WHERE、HAVING等子句中。以下是一些使用子查詢的示例和說明:
1. 在SELECT或FROM子句中使用子查詢
作為標量子查詢
標量子查詢返回單值,通常用于SELECT列表或WHERE子句中。

SELECT?id,?(SELECT MAX(price) FROM orders WHERE orders.user_id = users.id) AS max_order_price
FROM?users;

此例中,為每個用戶查詢其最大訂單價格。

作為表子查詢
子查詢可以放在FROM子句中,作為臨時表使用。

SELECT product_id, SUM(quantity) FROM (SELECT product_id, quantityFROM ordersWHERE order_date > '2023-01-01'
) AS recent_orders
GROUP BY product_id;

這里,先篩選出2023年后所有的訂單,然后對這些訂單按產品ID求和數量。
2. 在WHERE子句中使用子查詢

SELECT *?FROM customers?
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_amount > 1000);

此查詢找出有訂單金額超過1000的客戶信息。
3. 使用EXISTS和NOT EXISTS

SELECT *?FROM users?
WHERE EXISTS (SELECT 1 FROM orders WHERE orders.user_id = users.id AND order_amount > 500);

此查詢找出至少有一筆訂單金額超過500的用戶。
4. 使用WITH子句(公共表表達式CTE)
CTE可以讓你定義一個臨時的結果集,然后在主查詢中多次引用它。

WITH top_customers AS (SELECT customer_id, SUM(order_amount) as total_spentFROM ordersGROUP BY customer_idORDER BY total_spent DESCLIMIT 10
)
SELECT c.name, t.total_spent
FROM customers c
JOIN top_customers t ON c.customer_id = t.customer_id;

這個例子中,首先找出消費總額最高的前10位客戶,然后顯示他們的名字和消費總額。
注意事項

  • 子查詢的性能是值得關注的點,特別是當子查詢結果很大或需要多次執行時,可能會影響查詢效率。
  • Presto會嘗試優化子查詢的執行,例如通過半連接優化來減少數據掃描。
  • 當子查詢返回多行結果而被用于需要單值的上下文時,需要使用聚合函數如ANY_VALUE或轉換為多列結果的處理方式。

解釋Presto中的窗口函數。

Presto中的窗口函數是一種強大的分析工具,它允許你在一組相關的行(即“窗口”)上執行計算,而不是在整個查詢結果集上。窗口函數通過結合OVER子句來定義這個窗口的范圍和行為,從而提供了一種在保持行的原始上下文的同時,進行排序、分組、聚合或排名的能力。窗口函數廣泛應用于數據分析和報表生成,特別是在需要進行分組統計或行間比較的場景中。
窗口函數的基本結構
窗口函數的一般語法如下:

function_name(expression) OVER ([PARTITION BY column1, column2,...][ORDER BY column1 [ASC|DESC], column2 [ASC|DESC],...][ROWS BETWEEN start AND end]
)
  • function_name: 窗口函數的名稱,如SUM, AVG, COUNT, RANK, DENSE_RANK, ROW_NUMBER等。
  • expression: 傳遞給窗口函數的表達式或列名。
  • PARTITION BY: 可選子句,用于定義窗口內的分區,類似于GROUP BY,但保留了每個組內行的順序。
  • ORDER BY: 可選子句,用于在窗口內對行進行排序,這對于許多窗口函數來說是必須的,因為它定義了函數執行的順序。
  • ROWS BETWEEN start AND end: 可選子句,用于指定窗口的范圍。start和end可以是UNBOUNDED PRECEDING(窗口開始于分組的第一行)、CURRENT ROW、UNBOUNDED FOLLOWING(窗口結束于分組的最后一行)或它們的組合,以及帶有偏移量的PRECEDING或FOLLOWING。

常見窗口函數示例
ROW_NUMBER(): 為窗口內的每一行分配一個唯一的、連續的整數。

SELECT?order_id,user_id,order_date,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_date DESC) as rank
FROM?orders;

這個查詢為每個用戶的訂單按日期降序分配一個排名。

SUM() OVER(): 計算窗口內所有行的總和。

SELECT?order_date,?product_id,?SUM(quantity) OVER (ORDER BY order_date) as running_total
FROM?order_details;

此查詢計算截至每條記錄為止的產品銷售總量。

LAG() / LEAD(): 獲取同一分區中前一行/后一行的值。

SELECT?user_id,?order_date,?LAG(order_date) OVER (PARTITION BY user_id ORDER BY order_date) as previous_order_date
FROM?orders;

這個查詢為每個用戶的每筆訂單找到上一筆訂單的日期。

窗口函數的強大之處在于,它們允許你在每個單獨的行上下文中執行聚合操作,同時保留了數據的完整性和順序性,非常適合復雜的分析場景。

Presto中的Page和Block是什么?

在Presto中,Page和Block是核心數據結構,它們對于理解Presto如何高效處理和傳輸數據至關重要。
Block

  • 定義:Block是Presto中用來存儲數據的最小處理單元。每個Block是一個字節數組,專門用于存儲特定類型的數據,比如整數(Int)、長整數(Long)、可變長度字符串(Varchar)等。Block中的每個數據項都有一個位置(position),這些位置標記了數據元素在Block中的索引。Block僅保存單列數據的一部分行。
  • 作用:Block設計用于優化內存使用和CPU緩存的局部性,使得數據處理更為高效。

Page

  • 定義:Page是Presto處理數據的最小邏輯單元,它由多個Block組成,每個Block對應表中的一列數據。因此,一個Page可以看作是一張表的一個數據子集,包含了構成一行數據的所有列Block。一個Page的最大大小限制為1MB,并且最多可以包含16個Block(根據早先的信息,這個具體的數量可能隨Presto版本更新有所變化)。
  • 作用:Page作為數據傳輸和處理的基本單位,允許Presto以列式存儲的方式高效地讀取、處理和傳輸數據。在查詢執行過程中,Operator通常會讀取和處理單個Page,這有助于減少內存消耗并加速查詢處理。

總結來說,Block是Presto中用來存儲單列數據的塊,而Page則是由多個這樣的Block橫向拼接而成,代表了一組相關行的數據集合。這種結構設計有利于批量處理和向量化運算,提升了大數據查詢的性能。

描述Presto如何處理列式存儲數據。

1. 列式存儲的優勢
列式存儲與行式存儲相比,在數據分析和查詢方面具有明顯的優勢。列式存儲將數據按列而不是按行存儲在磁盤上,這使得查詢時可以只讀取需要的列,而無需加載整行數據,從而減少了磁盤I/O和網絡傳輸的開銷。此外,列式存儲還便于數據壓縮和編碼,因為相同列的數據類型相同,壓縮效率更高。
2. Presto對列式存儲的支持
Presto天然地對列式存儲比較友好,它支持多種列式存儲格式,如Parquet、ORC等。這些格式在Presto中得到了很好的優化,能夠充分利用列式存儲的優勢,提高查詢性能。
3. Presto處理列式存儲數據的流程
查詢接收與解析:當客戶端提交SQL查詢請求時,Presto的協調器(Coordinator)負責接收并解析查詢語句。解析后的查詢計劃會被轉換成邏輯查詢計劃,并進一步優化為物理執行計劃。
任務分發與執行:優化后的查詢計劃會被分發到多個工作節點(Worker)上執行。每個工作節點會根據分配的任務讀取并處理數據。由于Presto支持列式存儲,工作節點在讀取數據時可以直接從列式存儲介質中加載需要的列,無需加載整行數據。
內存計算與聚合:Presto采用內存計算模式,對讀取的數據進行流式處理。在內存中,Presto可以對數據進行排序、聚合等操作,進一步減少磁盤I/O和網絡傳輸的開銷。同時,Presto的并行計算能力也使得它能夠同時處理多個查詢任務,提高整體查詢性能。
結果返回:處理完數據后,工作節點會將結果返回給協調器。協調器將收集所有工作節點的結果并進行匯總,最終將查詢結果返回給客戶端。
4. 注意事項
列式存儲格式的選擇:雖然Presto支持多種列式存儲格式,但不同的格式在性能上可能存在差異。因此,在選擇列式存儲格式時,需要根據具體的數據特點和查詢需求進行權衡。
數據壓縮與編碼:列式存儲數據通常需要進行壓縮和編碼以節省存儲空間和提高查詢性能。Presto支持多種壓縮和編碼算法,可以根據實際情況進行選擇。
查詢優化:為了充分發揮Presto處理列式存儲數據的優勢,需要對查詢語句進行優化。例如,避免使用全表掃描、合理使用索引、優化查詢條件等。

ORC和Parquet格式在Presto中的支持情況如何?

在Presto中,ORC(Optimized Row Columnar)和Parquet這兩種列式存儲格式都得到了良好的支持,但針對這兩種格式的優化程度有所不同:
1、ORC格式:

  • Presto對ORC格式的支持非常友好,并且進行了特定的優化。由于ORC格式與Hive緊密集成,且在存儲壓縮率、數據導入速度以及查詢效率方面表現出色,Presto在讀取ORC文件時能發揮出較高的性能。
  • ORC文件是自描述的,包含豐富的元數據,并且支持多種壓縮算法,這有助于減少存儲空間消耗并加快數據處理速度。
  • Presto在處理ORC文件時,能夠有效利用其結構特性進行快速列式讀取和高效過濾,特別適合大數據查詢場景。

2、Parquet格式:

  • Presto也支持Parquet格式,這是一種廣泛使用的列式存儲格式,以其良好的跨平臺兼容性和對復雜數據結構的支持著稱。
  • 相對于ORC,Presto可能在對Parquet的支持上略遜一籌,但這并不意味著Parquet在Presto中的表現不佳。實際上,Parquet也是高度優化的,并且在很多場景下能夠提供優秀的查詢性能。
  • Parquet同樣支持列式存儲和多種壓縮算法,且因其跨平臺的特性,被諸如Impala等其他查詢引擎廣泛采用。

總體而言,Presto對這兩種列式存儲格式的支持都是相當成熟的,具體選擇哪種格式取決于具體的應用場景、數據特性和生態系統集成需求。如果與Hive集成緊密且追求極致的性能,ORC可能是更好的選擇;而如果需要更好的跨平臺兼容性和支持復雜數據類型,Parquet則可能是更合適的選擇。

如何在Presto中使用壓縮數據格式?

在Presto中處理壓縮數據格式主要涉及兩個方面:讀取外部壓縮數據源和控制查詢結果輸出的壓縮。以下是關于這兩個方面的簡要說明:
讀取外部壓縮數據源
Presto原生支持讀取像ORC和Parquet這類已經壓縮的列式存儲格式,這些格式在存儲時就已經應用了列級別的壓縮。當你在Presto中查詢存儲為ORC或Parquet格式的數據時,Presto會自動處理解壓縮過程,無需額外配置。
對于非列式存儲,如文本文件(CSV、TSV等),雖然Presto本身不直接支持讀取壓縮文件(如.gz或.bz2),但你可以通過Hadoop或類似文件系統間接讀取這些壓縮文件。確保你的Presto部署與Hadoop環境集成,這樣Presto就能通過Hadoop的輸入格式處理器自動解壓文件。
控制查詢結果輸出的壓縮
Presto查詢結果默認情況下可能不會被壓縮,但你可以在客戶端或中間件層面配置結果的壓縮。例如,如果你是通過JDBC、HTTP接口或者使用Presto CLI來運行查詢,可以采取以下措施:
使用CLI時,Presto CLI本身不直接支持結果壓縮,但你可以將輸出重定向到支持壓縮的命令,如使用gzip:

presto --execute "SELECT ...;" | gzip > results.gz

通過HTTP接口,如果你通過Presto的HTTP REST API獲取查詢結果,可以通過HTTP客戶端設置接受壓縮響應(如Accept-Encoding: gzip),Presto服務器端會根據請求頭決定是否壓縮響應體。
JDBC連接,大多數現代JDBC驅動程序和HTTP客戶端會自動處理響應壓縮,你可能不需要做額外配置,除非你想自定義壓縮級別或算法。
中間件服務:如果你在Presto和客戶端之間使用了如Trino(原PrestoSQL) Gateway或其他API網關,可以在這些組件上配置結果壓縮策略。
總之,Presto在讀取支持的列式存儲格式時能自動處理壓縮數據,而對于查詢結果的壓縮,則需借助客戶端、網絡協議或中間件的特性來實現。

解釋Presto中的內存管理和數據結構。?

Presto的內存管理是其高效處理大規模數據查詢的關鍵因素之一。它采用內存池的方式來管理兩種類型的內存:用戶內存(User Memory)和系統內存(System Memory),以此來避免頻繁的內存申請和釋放帶來的性能損耗。
內存類型
1、用戶內存(User Memory):主要用于數據處理任務,如哈希連接(Hash Join)、聚合操作(Aggregation)等。這部分內存直接關系到查詢的執行效率和所能處理的數據量。
2、系統內存(System Memory):主要用于輸入輸出緩沖(Input/Output Buffers)、數據交換(Exchange Buffers)等功能,確保數據在節點間的高效傳輸。系統內存默認預留了總內存的40%,用于維護內存中的緩沖區和其他系統級任務。
內存池管理

  • Presto使用內存池技術,預先分配好內存池的大小,然后在查詢執行期間從內存池中分配內存,這樣可以減少內存碎片化,提高內存使用效率。
  • 內存分配策略旨在平衡查詢之間的資源分配,避免某個查詢占用過多內存導致其他查詢因內存不足而失敗。
  • 當查詢執行時,Presto會根據查詢的內存需求動態調整內存分配,同時提供機制來監控和管理內存使用,比如低內存殺手(Low Memory Killer)策略,可以在集群內存達到閾值時選擇性地終止查詢以釋放內存。

數據結構
雖然沒有詳細列出Presto內部所有使用的數據結構,但考慮到其高性能數據處理的特點,可以推測Presto內部會采用多種高效數據結構來支撐其內存管理及查詢處理邏輯,例如:

  • 數組:對于列式數據處理,數組可能用于存儲特定類型的數據塊,便于向量化操作。
  • 哈希表:在執行哈希連接時,可能會用到哈希表來快速查找匹配項。
  • 堆和優先隊列:在執行排序或Top-N查詢時,可能會使用堆或優先隊列來管理數據排序。
  • 位圖索引:在進行過濾操作時,位圖索引可以高效地標記滿足條件的行。

Presto的設計目標是高度并行和分布式,因此它的數據結構選擇和內存管理策略都是為了最大化并行處理能力,同時確保內存的高效利用。

什么情況下Presto的性能會下降?

1、資源不足:當Presto集群中的協調器(coordinator)或工作節點(worker)的內存、CPU或磁盤I/O資源不足時,會導致查詢性能下降,甚至查詢失敗。特別是內存不足時,可能會觸發低內存殺手(low-memory killer)策略,終止正在運行的查詢以釋放資源。
2、不合理分區:數據表如果未合理分區或分區策略不當,會導致Presto需要掃描大量不必要的數據,從而影響查詢效率。合理分區可以顯著減少數據讀取量,提升性能。
3、列式存儲格式選擇不當:雖然Presto支持ORC和Parquet等列式存儲格式,但如果數據未使用這些格式存儲,或者未針對Presto優化(如使用了非最佳的壓縮算法),也可能導致性能下降。特別是未使用Presto對ORC文件讀取的特定優化時。
4、查詢設計不佳:復雜的關聯查詢、過度使用子查詢、缺乏索引或過濾條件的使用不當,都可能導致數據處理量激增,進而影響性能。優化查詢邏輯,避免全表掃描,使用合適的窗口函數和聚合操作,對提升性能至關重要。
5、網絡瓶頸:Presto在分布式環境中運行,數據需要在網絡中傳輸。如果網絡飽和或延遲高,尤其是在數據跨節點交換時,會嚴重影響查詢性能。
6、配置不當:Presto的配置參數(如內存分配比例、并發度設置、交換空間使用限制等)若未根據實際硬件和工作負載進行優化,也可能成為性能瓶頸。
7、數據傾斜:在數據分布不均的情況下,某些節點可能需要處理遠多于其他節點的數據量,造成負載不平衡,影響整體查詢性能。
8、過時或不兼容的軟件版本:使用了已知存在性能問題或與硬件不完全兼容的Presto版本,也可能導致性能下降。
9、并發查詢過多:高并發查詢場景下,如果資源管理不當,過多的查詢爭搶有限的資源,會相互影響性能。
解決這些問題通常需要綜合考慮硬件優化、軟件配置調整、查詢優化以及數據模型的改進。

引用:通義千問

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40175.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40175.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

適合家居建材企業的CRM系統盤點(2024版)

當前,CRM市場上,國際巨頭的市場優勢正在逐漸減弱,國內CRM企業奮起追趕,呈現出強勁的崛起勢頭。因此,對于家居建材企業來講,在進行CRM選型時,如何選擇一款合適的系統是關乎企業高效發展的重要課題…

探索C嘎嘎的奇妙世界:第十九關---STL(list的模擬實現)

1. 基本框架 首先&#xff0c;我們先從節點的準備工作入手&#xff0c;請看示例&#xff1a; #pragma once #include<iostream> #include<assert.h> using namespace std; //節點 template<class T> struct ListNode {ListNode<T>* _next;Li…

矩陣鍵盤與密碼鎖

目錄 1.矩陣鍵盤介紹?編輯 2.掃描的概念 3.代碼演示&#xff08;讀取矩陣鍵盤鍵碼&#xff09; 4.矩陣鍵盤密碼鎖 1.矩陣鍵盤介紹 為了減少I/O口的占用&#xff0c;通常將按鍵排列成矩陣形式&#xff0c;采用逐行或逐列的 “掃描”&#xff0c;就可以讀出任何位置按鍵的狀態…

免殺筆記 ----> ShellCode Loader !!!

學了那么久的前置知識&#xff0c;終于到了能上線的地方了&#xff01;&#xff01;&#xff01; 不過這里還沒到免殺的部分&#xff0c;距離bypass一眾的殺毒軟件還有很長的路要走&#xff01;&#xff01; 目錄 1.ShellCode 2.ShellCode Loader的概念 3.可讀可寫可…

字符串函數5-9題(30 天 Pandas 挑戰)

字符串函數 1. 相關知識點1.5 字符串的長度條件判斷1.6 apply映射操作1.7 python大小寫轉換1.8 正則表達式匹配2.9 包含字符串查詢 2. 題目2.5 無效的推文2.6 計算特殊獎金2.7 修復表中的名字2.8 查找擁有有效郵箱的用戶2.9 患某種疾病的患者 1. 相關知識點 1.5 字符串的長度條…

代碼隨想錄算法訓練營第四十四天|188.買賣股票的最佳時機IV、309.最佳買賣股票時機含冷凍期、714.買賣股票的最佳時機含手續費

188.買賣股票的最佳時機IV 題目鏈接&#xff1a;188.買賣股票的最佳時機IV 文檔講解&#xff1a;代碼隨想錄 狀態&#xff1a;不會 思路&#xff1a; 在股票買賣1使用一維dp的基礎上&#xff0c;升級成二維的即可。 定義dp[k1][2]&#xff0c;其中 dp[j][0] 表示第j次交易后持…

虛擬ECU:純電動汽車發展下的新選擇

人類文明的進步是一個不斷自我否定、自我超越的過程。21世紀以來&#xff0c;隨著科技進步和經濟社會發展&#xff0c;能源和交通系統已從獨立于自然環境的孤立系統&#xff0c;轉變為與自然、技術、社會深度耦合的復雜系統。為實現可持續發展和應對氣候變化&#xff0c;世界各…

【居家養老實訓室】:無障礙設施建設與評估

本文圍繞居家養老實訓室中的無障礙設施建設與評估展開討論。首先闡述了無障礙設施對于居家養老的重要性&#xff0c;接著詳細介紹了常見的居家養老無障礙設施類型&#xff0c;包括出入口、通道、臥室、衛生間等區域的設施。然后重點探討了無障礙設施的評估方法和標準&#xff0…

【C++航海王:追尋羅杰的編程之路】關聯式容器的底層結構——AVL樹

目錄 1 -> 底層結構 2 -> AVL樹 2.1 -> AVL樹的概念 2.2 -> AVL樹節點的定義 2.3 -> AVL樹的插入 2.4 -> AVL樹的旋轉 2.5 -> AVL樹的驗證 2.6 -> AVL樹的性能 1 -> 底層結構 在上文中對對map/multimap/set/multiset進行了簡單的介紹&…

《簡歷寶典》02 - 如果你是HR,你會優先打開哪份簡歷?

現在的求職環境不必多說&#xff0c;其實我們大家都還是很清楚的。所以&#xff0c;在這個環境下&#xff0c;寫一份優秀的簡歷&#xff0c;目的與作用也不必多說。那么&#xff0c;這一小節呢&#xff0c;我們先從簡歷這份文檔的文檔名開始說起。 目錄 1 你覺得HR們刷簡歷的時…

【深度學習】圖形模型基礎(5):線性回歸模型第二部分:單變量線性回歸模型

1.引言 在統計學與機器學習的廣闊領域中&#xff0c;線性回歸作為一種基礎而強大的預測技術&#xff0c;其核心在于通過輸入變量&#xff08;或稱預測器、自變量&#xff09;來估計輸出變量&#xff08;響應變量、因變量&#xff09;的連續值。本章聚焦于線性回歸的一個基本但…

Spring-@Component和@Configuration的區別

前言 在Spring框架中&#xff0c;Configuration和Component注解都是用于組件掃描和管理Bean的生命周期&#xff0c;但它們有著不同的用途和應用場景 Component 注解 Component是一個通用的 stereotype 注解&#xff0c;表明一個Java類為Spring框架中的一個Bean組件。Spring會自…

【C++】相機標定源碼筆記- 立體視覺相機的校準和圖像矯正類

類主要用于雙目相機的標定和矯正。它包含了讀取和保存相機模型、計算標定參數以及矯正圖像的功能。通過這些功能&#xff0c;可以實現雙目相機的標定和矯正&#xff0c;從而提高雙目相機的精度和穩定性。 公有函數&#xff1a; 構造函數、帶參構造函數、析構函數、讀取雙目相機…

摩斯邀您參加“WAIC 2024世界人工智能大會”

2024世界人工智能大會暨人工智能全球治理高級別會議&#xff08;簡稱“WAIC 2024”&#xff09;將于7月在上海世博中心、世博展覽館舉行&#xff0c;論壇時間為7月4日-6日&#xff0c;展覽時間為7月5日-7日。大會展覽面積超5.2萬平方米&#xff0c;重點圍繞核心技術、智能終端、…

STM32要學到什么程度才算合格?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「嵌入式的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“888”之后私信回復“888”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01; STM32 這玩意兒要學到啥…

今天聊聊AI

AI是在幫助開發者還是取代他們&#xff1f; 在軟件開發領域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;正在改變開發者的工作方式。無論是代碼生成、錯誤檢測還是自動化測試&#xff0c;AI工具正在成為開發者的得力助手。然而&#xff0c;這也引發了對開發者職業…

vscode 前行復制到下一行

目錄 這個技巧也比較多 選擇 python解釋器 F1 Ctrl Shift P 跳轉上一次編輯 下一次編輯 Ctrl d 會把當前行復制到下一行 步驟1&#xff1a;打開鍵綁定設置 使用VS Code設置換行 這個技巧也比較多 VS Code技巧匯總_vs code反縮進-CSDN博客 選擇 python解釋器 F1 Ctrl Shi…

Java中如何使用 tesseract-ocr 進行圖片文字提取(tesseract、tesseract訓練自己的字庫)

tesseract下載鏈接&#xff1a; github&#xff1a;https://github.com/tesseract-ocr/ db&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 文字識別技術在許多領域都有廣泛的應用&#xff0c;例如文檔處理、自動化辦公、移動設備上的文本輸入等。而Tesseract-OCR作…

Python推導式寫出簡潔高效的代碼方法詳解

概要 推導式是Python中一種非常強大的語法特性,允許你用簡潔的語法創建列表、字典、集合等數據結構。使用推導式不僅可以讓代碼更加簡潔和易讀,還能提高代碼的執行效率。本文將詳細介紹Python中的各種推導式,并提供相應的示例代碼,幫助全面掌握這一強大的工具。 列表推導式…

【前端項目筆記】9 數據報表

數據報表 效果展示&#xff1a; 在開發代碼之前新建分支 git checkout -b report 新建分支report git branch 查看分支 git push -u origin report 將本地report分支推送到云端origin并命名為report 通過路由的形式將數據報表加載到頁面中 渲染數據報表基本布局 面包屑導航…