【Java八股文】10-數據結構與算法面試篇

【Java八股文】10-數據結構與算法面試篇

  • 數據結構與算法面試題
  • 數據結構
    • 紅黑樹說一下
    • 跳表說一下?
    • LRU是什么?如何實現?
    • 布隆過濾器怎么設計?時間復雜度?
  • 排序算法
    • 排序算法及空間復雜度


數據結構與算法面試題

數據結構

紅黑樹說一下

紅黑樹(Red-Black Tree)是一種自平衡的二叉搜索樹,它在插入和刪除操作后能夠通過旋轉和重新著色來保持樹的平衡。紅黑樹的特點如下:

  • 每個節點都有一個顏色,紅色或黑色。
  • 根節點是黑色的。
  • 每個葉子節點(NIL節點)都是黑色的。
  • 如果一個節點是紅色的,則它的兩個子節點都是黑色的。
  • 從根節點到葉子節點或空子節點的每條路徑上,黑色節點的數量是相同的。

紅黑樹通過這些特性來保持樹的平衡,確保最長路徑不超過最短路徑的兩倍,從而保證了在最壞情況下的搜索、插入和刪除操作的時間復雜度都為O(logN)。epoll 用了紅黑樹來保存監聽的 socket。

跳表說一下?

跳表(Skip List)是一種基于鏈表的數據結構,它通過添加多層索引來加速搜索操作。

  • 跳表中的數據是有序的。
  • 跳表中的每個節點都包含一個指向下一層和右側節點的指針

跳表通過多層索引的方式來加速搜索操作。最底層是一個普通的有序鏈表,而上面的每一層都是前一層的子集,每個節點在上一層都有一個指針指向它在下一層的對應節點。這樣,在搜索時可以通過跳過一些節點,直接進入目標區域,從而減少搜索的時間復雜度。

跳表的平均搜索、插入和刪除操作的時間復雜度都為O(logN),但空間復雜度稍高。跳表常用于需要高效搜索和插入操作的場景,如數據庫、緩存等。redis 用了跳表來實現 zset。

LRU是什么?如何實現?

LRU 是一種緩存淘汰算法,當緩存空間已滿時,優先淘汰最長時間未被訪問的數據。

實現的方式是哈希表+雙向鏈表結合。

在這里插入圖片描述

  • 使用哈希表存儲數據的鍵值對,鍵為緩存的鍵,值為對應的節點。
  • 使用雙向鏈表存儲數據節點,鏈表頭部為最近訪問的節點,鏈表尾部為最久未訪問的節點。
  • 當數據被訪問時,如果數據存在于緩存中,則將對應節點移動到鏈表頭部;如果數據不存在于緩存中,則將數據添加到緩存中,同時創建一個新節點并插入到鏈表頭部。
  • 當緩存空間已滿時,需要淘汰最久未訪問的節點,即鏈表尾部的節點。

上面這種思想方式,LRU 算法可以在 O(1) 的時間復雜度內實現數據的插入、查找和刪除操作。

布隆過濾器怎么設計?時間復雜度?

布隆過濾器」可以用來解決類似的問題,具有運行快速,內存占用小的特點,它是一個保存了很長的二級制向量,同時結合 Hash 函數實現的。

而高效插入和查詢的代價就是,它是一個基于概率的數據結構,只能告訴我們一個元素絕對不在集合內,對于存在集合內的元素有一定的誤判率。

  • 初始化:當我們創建一個布隆過濾器時,我們首先創建一個全由0組成的位數組(bit array)。同時,我們還需選擇幾個獨立的哈希函數,每個函數都可以將集合中的元素映射到這個位數組的某個位置。
  • 添加元素:在布隆過濾器中添加一個元素時,我們會將此元素通過所有的哈希函數進行映射,得到在位數組中的幾個位置,然后將這些位置標記為1。
  • 查詢元素:如果我們要檢查一個元素是否在集合中,我們同樣使用這些哈希函數將元素映射到位數組中的幾個位置,如果所有的位置都被標記為1,那么我們就可以說該元素可能在集合中。如果有任何一個位置不為1,那么該元素肯定不在集合中

排序算法

排序算法及空間復雜度

  • 插入類排序:
    • 直接插入排序:將待排序元素逐個插入到已排序序列的合適位置,形成有序序列。
      • 時間復雜度:平均為O(N2),最好情況下為O(N),最壞情況下為O(N2)。
      • 空間復雜度:因為每回只移動一個所以空間復雜度為O(1)。
      • 穩定性:穩定。
    • 折半插入排序:將排好元素一分為二來進行查找插入的位置。
      • 時間復雜度:平均為O(N^2),最好情況下為O(NlogN),最壞情況下為O(N2)。
      • 空間復雜度:因為每回只移動一個所以空間復雜度為O(1)。
      • 穩定性:穩定。
    • 希爾排序:將待排數組分成若干個稀疏的子序列,分別進行直接插入排序,使得稀疏的子序列較為有序,然后再全部進行次直接插入排序,即可完成。
      • 時間復雜度:業界統一認為為O(N^1.3)。
      • 空間復雜度:因為每回只移動一個所以空間復雜度為O(1)
      • 穩定性:不穩定。
  • 交換類排序
    • 冒泡排序:在掃描的過程中順次比較相鄰的兩個元素的大小,若逆序就交換位置。
      • 時間復雜度:平均為O(N2),最好情況下為O(N),最壞情況下為O(N2)。
      • 空間復雜度:因為每回只移動一個所以空間復雜度為O(1)。
      • 穩定性:穩定。
    • 快速排序
      • 時間復雜度:平均為O(NlogN),最好情況下為O(NlogN),最壞情況下為O(N^2)。
      • 空間復雜度:使用遞歸進行深搜,所以為O(NlogN)。
      • 穩定性:不穩定。
  • 選擇排序
    • 簡單選擇排序:從第一個記錄開始,通過n-1次關鍵字比較,從n個記錄中選擇出關鍵字最小的記錄,并和第一個記錄進行比較。
      • 時間復雜度:平均為O(N2),最好情況下為O(N2),最壞情況下為O(N^2)。
      • 空間復雜度:因為每回只移動一個所以空間復雜度為O(1)。
      • 穩定性:不穩定。
    • 堆排序:把待排序的數字看成一顆完全二叉樹的順序表示,每個結點表示一個記錄,第一個記錄作為二叉樹的根,對剩下的記錄依次逐層從左到右順序排序,(i從0開始)任意節點r[i]的左孩子是r[2r+1],右孩子是r[2i+2],雙親是r[(i+1)/2-1]。對這顆完全二叉樹進行調整。大根堆: r[i]>r[2i+1]且r[i]>r[2i+2],也就是父節點大于孩子節點的完全二叉樹稱為大根堆。
      • 時間復雜度:平均為O(NlogN),最好情況下為O(NlogN),最壞情況下為O(NlogN)。
      • 空間復雜度:因為每回只移動一個所以空間復雜度為O(1)。
      • 穩定性:不穩定。

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

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

相關文章

Docker換源加速(更換鏡像源)詳細教程(2025.2最新可用鏡像,全網最詳細)

文章目錄 前言可用鏡像源匯總換源方法1-臨時換源換源方法2-永久換源(推薦)常見問題及對應解決方案1.換源后,可以成功pull,但是search會出錯 補充1.如何測試鏡像源是否可用2.Docker內的Linux換源教程 換源速通版(可以直…

華為云deepseek大模型平臺:deepseek滿血版

華為云硅基流動使用Chatbox接入DeepSeek-R1滿血版671B 1、注冊: 華為云deepseek大模型平臺注冊:https://cloud.siliconflow.cn/i/aDmz6aVN 說明:填寫邀請碼的話邀請和被邀請的賬號都會獲得2000 萬 Tokens;2個帳號間不會與其他關聯…

抓包工具是什么?

抓包工具是一種用于捕獲和分析網絡數據包的軟件或硬件設備。它可以幫助用戶監控網絡通信過程,查看網絡中傳輸的數據內容、協議類型、源地址、目的地址等信息。以下是關于抓包工具的一些詳細解釋: 1. 主要功能 捕獲數據包:抓包工具能夠實時捕…

51c大模型~合集71

我自己的原文哦~ https://blog.51cto.com/whaosoft/12260659 #大模型推理加速技術的學習路線 EfficientQAT 可以在 41 小時內在單個 A100-80GB GPU 上完成對 2-bit Llama-2-70B 模型的量化感知訓練。與全精度模型相比,精度僅下降了不到 3%(69.48 v…

OpenBMC:BmcWeb實例化App

BmcWeb是OpenBMC的一個核心模塊,對外負責響應Redfish請求,并且由于OpenBMC的Web使用的Redfish api,所以BmcWeb也是Web的后臺。 1.main函數 //src\webserver_main.cpp #include "webserver_run.hpp"int main(int /*argc*/, char**…

利用AI優化可再生能源管理:Python讓綠色能源更高效

利用AI優化可再生能源管理:Python讓綠色能源更高效 引言 在全球氣候變化和能源危機的背景下,可再生能源的利用變得尤為重要。然而,可再生能源的管理和優化面臨諸多挑戰,如能源生產的不穩定性和能源需求的波動性。幸運的是&#…

改BUG:Mock測試的時候,when失效

問題再現: 這里我寫了一測試用戶注冊接口的測試類,并通過when模擬下層的服務,但實際上when并沒有奏效,還是走了真實的service層的邏輯。 package cn.ac.evo.review.test;import cn.ac.evo.review.user.UserMainApplication; imp…

單片機 code RO-data RW-data ZI-data以及OTA學習

帶著問題去學習:這些數據是什么?分別放在哪里, 是什么:我個人的理解 code 和RO-data 分別是代碼和只讀數據,RW-data以及ZI-data分別是讀寫數據和初始化數據。 codeRO-data的大小正好是所占用ROM的大小,RO…

什么是LoRA微調

LoRA是大模型微調方法的一種,它的特點是只在模型的 部分權重(如 QKV 矩陣) 上 添加可訓練參數 通過 低秩矩陣(AB) 來優化參數更新 優點: 極大降低顯存消耗(deepseek 7B 只需 10GB) 適…

EasyRTC低延遲通信與智能處理:論嵌入式WebRTC與AI大模型的技術融合

在當今數字化時代,實時通信的需求日益增長,視頻通話作為一種高效、直觀的溝通方式,廣泛應用于各個領域。WebRTC技術的出現,為實現瀏覽器之間的實時音視頻通信提供了便捷的解決方案。而基于WebRTC技術的EasyRTC視頻通話SDK&#xf…

10、k8s對外服務之ingress

service和ingress的作用 service的作用 NodePort:會在每個節點開放一個端口,端口號30000-32767。 也是只能用于內網訪問,四層轉發。實現負載均衡。不能基于域名進行訪問。 clusterip:service的默認類型,只能在集群…

Java數據結構---棧

目錄 一、棧的概念 二、棧的基本方法 三、棧的模擬實現 四、棧的練習 1、括號匹配 2、出棧入棧次序匹配 一、棧的概念 棧是一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂,另一端稱為棧底…

從CNN到Transformer:遙感影像目標檢測的未來趨勢

文章目錄 前言專題一、深度卷積網絡知識專題二、PyTorch應用與實踐(遙感圖像場景分類)專題三、卷積神經網絡實踐與遙感影像目標檢測專題四、卷積神經網絡的遙感影像目標檢測任務案例【FasterRCNN】專題五、Transformer與遙感影像目標檢測專題六、Transfo…

php-fpm

摘要 php-fpm(fastcgi process manager)是PHP 的FastCGI管理器,管理PHP的FastCGI進程,提升PHP應用的性能和穩定性 php-fpm是一個高性能的php FastCGI管理器,提供了更好的php進程管理方式,可以有效的控制內存和進程,支…

Python strip() 方法詳解:用途、應用場景及示例解析(中英雙語)

Python strip() 方法詳解:用途、應用場景及示例解析 在 Python 處理字符串時,經常會遇到字符串前后存在多余的空格或特殊字符的問題。strip() 方法就是 Python 提供的一個強大工具,專門用于去除字符串兩端的指定字符。本文將詳細介紹 strip(…

open webui 部署 以及解決,首屏加載緩慢,nginx反向代理訪問404,WebSocket后端服務器鏈接失敗等問題

項目地址:GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 選擇了docker部署 如果 Ollama 在您的計算機上,請使用以下命令 docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gatewa…

docker安裝ros2 并在windows中顯示docker內ubuntu系統窗口并且vscode編程

這里包括docker desktop安裝ros2 humble hawkshill , 安裝xserver(用來在windows中顯示ubuntu中窗口), vscode安裝插件連接docker并配置python的一系列方法 1.安裝xserver 為了能方便的在windows中顯示ubuntu內的窗口,比如rqt窗口 參考文章:https://www.cnblogs.com/larva-zhh…

VMware安裝Centos 9虛擬機+設置共享文件夾+遠程登錄

一、安裝背景 工作需要安裝一臺CentOS-Stream-9的機器環境,所以一開始的安裝準備工作有: vmware版本:VMware Workstation 16 鏡像版本:CentOS-Stream-9-latest-x86_64-dvd1.iso (kernel-5.14.0) …

C/C++ 中 volatile 關鍵字詳解

volatile 關鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改,比如:操作系統、硬件或者其它線程等。遇到這個關鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優化,從而可以提供對特殊…

處理器架構、單片機、芯片、光刻機之間的關系

這些術語都涉及到半導體和電子設備的設計與制造,但它們的含義和作用有所不同。下面我會逐個解釋,并描述它們之間的關系: 1. 處理器架構 (Processor Architecture) 處理器架構指的是處理器(CPU)的設計原理和結構。它定…