10 10數字流的秩

2021-10-05 10:53:49 字數 2439 閱讀 2624

面試題 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 就稱為秩。少一條魚骨,鹹魚...