python 判斷一個元素在不在list的時間複雜度
先上程式碼
import time
a = list(range(10**6))
b = 10**6-1
start = time.time()
if b in a:
print('ok')
end = time.time()
print('list:%f'%(end-start))
dicts = dict(zip(a,a))
start = time.time()
if b in dicts:
print('ok')
end = time.time()
print('dicts:%f'%(end-start))
結果:
上面的是list的結果 下面的是雜湊的結果. 可見python預設的尋找方式居然是遍歷 太蠢了. 時間複雜度o(n)
所以當需要重複查詢多個數據是不是在一個list裡面的時候 最好的辦法是先把list變成雜湊表.
相關推薦
python 判斷一個元素在不在list的時間複雜度
先上程式碼 import time a = list(range(10**6)) b = 10**6-1 start = time.time() if b in a: print('ok') end = time.time() print('list:%f'%(end-
尋找主元素演算法(時間複雜度O(N),C#)
主元素問題:大小為N的陣列A,其主要元素是一個出現次數超過N/2的元素。 最近在學習演算法,書上發現這樣一道題,並且提供了一種遞迴演算法的概要,但是感覺不是特別好(遞迴判斷(時間複雜度大於O(N)了),還要對N的奇偶做出判斷以及使用附加陣列B),網上看了一下有一個SEO排行最靠前的(不說名字了,
編寫程式,在一非遞減的順序表L中,刪除所有值相等的多餘元素。要求時間複雜度O(n),空間複雜度為O(1)
翠花上程式碼: Status delExcrescentValue(SeqList &S){ int flag = 0,val = S.elem[0];//記錄值不等的下標 //printf("%d\n",S.elem[0]); for(int i = 1;i
找出大陣列array中第k大的元素(要求時間複雜度O(n))
具體的程式碼實現:import java.util.Stack; /** * @author wuwh * @date createTime:2016年3月6日 上午12:23:14 */ public class KthBiggest { public static
刪除線性表中所有值為x的元素,要求時間複雜度為O(n),空間複雜度為O(1)
思路:統計不等於x的個數,用k記錄不等於x的元素的個數。邊統計邊把當前元素放在第k個位置上,最後修改表的長度 public static void del(List<Integer> l
python中如何不區分大小寫的判斷一個元素是否在一個列表中
拒絕 結果 大小寫 over 用戶 ima image -1 技術分享 python中判斷某一個元素是否在一個列表中,可以使用關鍵字in 和 not in. 示例如下: 如果需要輸出相應的信息,可以搭配使用if語句,這裏不贅述。 ---------------------
已知長度為n的線性表A採用順序儲存結構,請寫一個時間複雜度為O(n)、空間複雜度為O(1)的演算法,該演算法可刪除線性表中所有值為item的資料元素。
語言:C++ #include <iostream> using namespace std; typedef int ElemType; //定義 #define MAXSIZE 100 typedef struct {ElemType *elem; int length;}Sq
設計一個演算法,將一維陣列A(下標從1開始)中的元素迴圈右移k位,要求只用一個元素大小的附加儲存空間。給出演算法的時間複雜度。
程式碼 #include<stdio.h> #include<stdlib.h> #define n 10 int main() { int a[n] = { 0,1,2,3,4,5,6,7,8,9 }; int k, t=0,i,j,m; printf(
定義棧的資料結構,請在該型別中實現一個能夠得到棧中所含最小元素的min函式(時間複雜度應為O(1))。
import java.util.Stack; public class Solution { private Stack<Integer> min_stack=new Stack<Integer>(); private Stack<Integer&
1.給棧新增一個獲取最小值的方法(元素為Integer型),要求時間複雜度為O(1)
分析:在資料結構與演算法中,當要求時間複雜度最小時基本都是要犧牲空間複雜度。棧是先進後出,此處要求用棧實現一個獲取最小值的方法且時間複雜度為O(1),首先考慮的方向就是再借助一個棧來實現,這個棧主要用來儲存最小值序列(這個地方可以思考一下為什麼不能用一個變數來儲存最小值)。 下面直接附上程式碼:
定義棧的資料結構,請在該型別中實現一個能夠得到棧中所含最小元素的min函式(時間複雜度應為O(1))
/** 思路:利用兩個棧來實現,一個主棧正常壓棧出棧,一個輔助棧用來儲存主棧所有值的最小值, 壓棧時,當壓入的值比輔助棧棧頂值大時,主棧正常壓棧,輔助棧不壓棧,小於等於二者都壓棧; 出棧時,當主棧和輔助棧棧頂元素不相等時,主棧正常出棧,輔助棧不出棧。 */ class Sol
找出一個字串中最長並且不重複的子字串,要求時間複雜度越小越好
題目:找出一個字串中長度最長並且不含重複字元的子字串; 要解決這個問題有多種解法,在這裡我們來實現一種時間複雜度最小的方法,使用了雜湊值 程式碼如下:最終,時間複雜度為O(n),是用空間換時間來實現的。 //最長字元,開始位置的索引 public int startI
定義棧的資料結構,請在該型別中實現一個能夠得到棧中所含最小元素的min函式 (時間複雜度應為O(1))。
import java.util.Stack; /** * 定義棧的資料結構,請在該型別中實現一個能夠得到棧中所含最小元素的min函式 * (時間複雜度應為O(1))。 */ public class Solution { static Stack<Integer> da
從StL stack 查詢一個元素或者判斷一個元素是不是存在的方法
find(item) 如果有item,返回item的地址 如果沒有item, 函式找的是結尾元素的下一個 #include<cstdio> #include<cstring> #include<vector> #include<a
【python演算法】合併兩個有序陣列為一個有序的大陣列(時間複雜度最低)
思路按位迴圈比較兩個陣列,較小元素的放入新陣列,下標加一(注意,較大元素對應的下標不加一),直到某一個下標超過陣列長度時退出迴圈 假設兩個源陣列的長度不一樣,那麼假設其中短的陣列用完了,即全部放入到新陣列中去了,那麼長陣列中剩下的那一段就可以直接拿來放入到新陣列中去了。#co
JS中怎樣判斷一個元素是不是物件
JS中,判斷物件型別時存在一個bug,那就是null型別也是object,那麼如何精準判斷一個元素是物件呢。 方法一:typeof function isObj(val) { return val !== null && typeof(val) === 'o
判斷一個數是不是素數 埃拉託斯特尼篩法 時間複雜度 O(n*lglgn)
說明: 素數的定義:質數(prime number)又稱素數。一個大於1的自然數,除了1和它本身外,不能被其他自然數整除,換句話說就是該數除了1和它本身以外不再有其他的因數;否則稱為合數。 最小的素數是2,最小的合數是4 方法一: 根據素數的定義,判斷數n是不是素數,我們
把一個含有N個元素的陣列迴圈右移K位, 要求時間複雜度為O(N)
分析與解法 這個解法其實在《啊哈!演算法》有講到。 假設原陣列序列為abcd1234,要求變換成的陣列序列為1234abcd,即迴圈右移了4位,比較之後,不難看出,其中有兩段的順序是不變的:1234和abcd,可把兩段看成兩個整體。右移K位的過程就是把陣列的兩部分交換一下。
【Python】不使用迭代生成器生成斐波那契數列,並大幅降低時間複雜度
斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........ 這個數列從第3項開始,每
長度為n的順序表L,編寫一個時間複雜度為O(n),空間複雜度為O(1)的演算法,該演算法刪除線性表中所有值為X的元素
解法:用K記錄順序表L中不等於X的元素個數,邊掃描L邊統計K,並將不等於X的元素向前放置K位置上,最後修改L長度 void del_x_1(SqList &L,Elemtype x){ int k=0; for(i=0;i<L.length;i++) {