leetcode上查詢問題很多,比如第一題,兩數之和,找到兩個數字和為target
暴力列舉的方法就需要o (n^2) 先排序再用雙指標的方法也需要o(nlogn)然而查詢表的方法只需要o(n) ,我和我的小夥伴們都驚呆了。
可以說,優化了乙個階層,效率十分之高。
那,什麼是查詢表?什麼時候用?以及,查詢表怎麼用?
下面我一一分析:
查詢表,就是用來查詢的表咯。 對於要查詢的資料,我全部放入查詢表中,時間複雜度是o(n),再根據條件一一篩選,時間複雜度也是o(n)得出答案。
舉個例子,兩數之和。 找到乙個陣列中的兩個數和為目標值(以給定)。首先將陣列的所有數,都是可能的結果,放入查詢表中。o(n) ,再遍歷這個陣列o(n),然後根據條件篩選。
條件是啥? target-nums[i] 是否在查詢表中。(nums[i]就是每乙個數)
非常簡單吧,和暴力遍歷的方法差不多。
那為什麼查詢表的方法能優化到o(n)呢?
這就和查詢表的底層實現有關了。
因為,我這裡使用的查詢錶用unordered_map實現,也就是雜湊表。
我們知道,雜湊表查詢元素的時間複雜度是o(1) 非常的amazing啊!!!
發現沒有?優化的地方僅僅是查詢中的o(n)優化成o(1),本來結果是o(n*n)
現在變成o(n*1)
這就是查詢表的本質。
看出了他的本質,再利用他解題就輕而易舉了。
回答第二個問題:什麼時候用查詢表?
這tm還用問嗎?
查詢的時候啊。
當你需要在陣列,string vector等序列中,找到你要的答案,此時,查詢表就可以派上用場。
最後乙個問題:怎麼用?
這個問題太關鍵了,聽我慢慢道來。
先回憶一下,第乙個問題中,我解釋的查詢表的原理。還記得嗎?不記得倒回去看看。
我們僅僅優化了查詢的部分。
其他部分和暴力遍歷是一樣的。
那麼,**寫成暴力遍歷的樣子就行了,最後稍加修改就大功告成了。
什麼?很抽象?
舉個栗子。
這是兩數之和的**:
class solution
int numberofboomerangs(vector>& points)
}return res;}};
可以看出,資料量是挺大的。 mysql 分表聯合查詢 解決分表後聯合查詢
解決分表後聯合查詢 merge儲存引擎,也被認識為mrg myisam引擎,是乙個相同的可以被當作乙個來用的myisam表的集合。相同 意味著所有表同樣的列和索引資訊。你不能合併列被以不同順序列於其中的表,沒有恰好同樣列的表,或有不同順序索引的表。而且,任何或者所有的表可以用myisampack來壓...
ORM跨表查詢總結
一 基於物件的查詢 子查詢 1 一對多 正向查詢 基於 字段 反向查詢 基於 表名 set.all 注意 表名全部小寫 2 多對多 正向查詢 基於 欄位.all 反向查詢 基於 表名 set.all 注意 表名全部小寫 3 一對一 正向查詢 基於 字段 反向查詢 基於 表名 注意 表名全部小寫 二 ...
mysql鍊錶查詢共有的 MySQL連表查詢
一 連表查詢之一對多表 1 首先建立兩個表,並新增兩個表的外來鍵約束 人員表中的part id與part表中的pid,設定外來鍵約束。1 create table part 2 pid int 11 not null,3 caption varchar 32 not null,4 primary k...