面試題 10.10. 數字流的秩
假設你正在讀取一串整數。每隔一段時間,你希望能找出數字 x 的秩(小於或等於 x 的值的個數)。請實現資料結構和演算法來支援這些操作,也就是說:
實現 track(int x) 方法,每讀入乙個數字都會呼叫該方法;
實現 getrankofnumber(int x) 方法,返回小於或等於 x 的值的個數。
注意:本題相對原題稍作改動
示例:輸入:
["streamrank", "getrankofnumber", "track", "getrankofnumber"]
[, [1], [0], [0]]
輸出:[null,0,null,1]
如果單純是通過陣列排序,計算秩,那麼時間複雜度會達到o(n^2)
遇到有序的,需要優化,我們首選二叉搜尋樹
如果該節點在根節點左邊,那麼我們需要去計算左子樹的數量。
但是我們可以自定義乙個資料結構,來儲存這個左子樹數量self.leftsize
當節點在根節點右邊,我們可以把根節點的leftsize加進來,再對該節點的右節點計算秩
直到右節點為空
這是書中的參考解法,因為自己實在是看不懂線段樹,另外輸入輸出並不與官方匹配
我還有乙個二叉樹層序遍歷,方便你們檢視二叉樹的狀態
from typing import *
class ranknode:
def __init__(self, val):
self.leftsize = 0
self.left = none
self.right = none
self.data = val
def insert(self, d):
"""插入操作
:param d:
:return:
"""if d <= self.data:
if self.left is not none:
self.left.insert(d)
else:
self.left = ranknode(d)
self.leftsize += 1
else:
if self.right is not none:
self.right.insert(d)
else:
self.right = ranknode(d)
def getrank(self, d):
if d == self.data:
# 是當前尋找的值,直接返回我們預先存的變數self.leftsize
return self.leftsize
elif d < self.data:
if self.left is none:
return -1
else:
# 遞迴到左子樹查詢
return self.left.getrank(d)
elif d > self.data:
if self.right is none:
rightrank = -1
else:
rightrank = self.right.getrank(d)
if rightrank == -1:
return -1
else:
return rightrank + self.leftsize + 1
class solution:
def levelorder(self, root) -> list[list[int]]:
levels =
if not root:
return levels
queue = [root]
level = 0
while queue:
level_length = len(queue)
for i in range(level_length):
popednode = queue.pop(0)
if popednode.left:
if popednode.right:
level += 1
return levels
s = solution()
root = ranknode(20)
root.insert(15)
root.insert(10)
root.insert(5)
root.insert(13)
root.insert(25)
root.insert(23)
root.insert(24)
root.insert(25)
level = s.levelorder(root)
a = root.getrank(25)
print(a)
print(level)
矩陣秩的理解
首先,講到矩陣的秩,幾乎必然要引入矩陣的svd分解 x usv u,v正交陣,s是對角陣。如果是完全svd分解的話,那s對角線上非零元的個數就是這個矩陣的秩了 這些對角線元素叫做奇異值 還有些零元,這些零元對秩沒有貢獻。有了這個前提,我們就可以用各種姿勢來看秩了 1.把矩陣當做樣本集合,每一行 或每...
向量組的秩
v v中有一族向量s ss 其中可能只有有限個向量,也可能有無限個向量 如果在s ss中存在一組向量 適合下列條件 1,2,r 1 2 r 線性無關 這族向量中的任意乙個向量都可以用 1,2,r 1 2 r 線性表示,那麼稱 是向量族s ss的極大線性無關組,簡稱極大無關組。上述定義 2 表示若將s...
9 矩陣的秩
1.你們家有 m 個人 每個人提供證件照若干張,一家人共提供了 n 張證件照,那麼 m n 如果稱 n 表示證件照集合的維度,那麼 m 表示證件照集合的秩。2.一條鹹魚躺在乙個砧板上,鹹魚有 x 根魚骨,鹹魚旁邊有 y 根蔥做裝飾。x y 稱為整體維度,那麼魚骨的數量 x 就稱為秩。少一條魚骨,鹹魚...