1. 程式人生 > >少女Q的量化交易轉型之路 #week 2 之二(計劃改動)

少女Q的量化交易轉型之路 #week 2 之二(計劃改動)

計劃改動: 對於資料結構part,不只能是光看書,速度太快容易underfitting,很多邏輯不實踐一下是理不清的,書上的內容結合leetcode的tag一起刷覺得效果會更好。準備從array開始到string開始做點題,tree部分題量很大,放在下週再看。 數學part暫時不變,腦子裡有個概念就好。

理論是灰的,生命之樹常青。

Leetcode Q13 Roman to Integer string-easy 在這裡插入圖片描述 在這裡插入圖片描述 題目大意是將羅馬數字轉換為整數,範圍在1~3999之間。具體規則題目寫得很清楚,大部分情況小的符號一定是在大的符號後邊的, 但是4,9,40,90,400,900除外。

個人思路:輸入是一串string,將每一個string的字元都從左到右遍歷一遍(從大到小),並轉化成數字加起來。但是問題是有6種特殊情況,一開始並沒想到怎麼排除,看到別人java的簡單暴力實現,就複製了一下思路。

程式碼實現:

class Solution:
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        num = 0
        T ={'I':1, 'V':5, 'X':10, 'L':50, 'C':100,
            'D':500, 'M':1000}
        for i in range(0, len(s)):
            # 遍歷並簡單加和。
            num = num + T.get(s[i])
        # 六種特殊情況,
if 'IV' in s: num -= 2 if 'IX' in s: num -= 2 if 'XL' in s: num -= 20 if 'XC' in s: num -= 20 if 'CD' in s: num -= 200 if 'CM' in s: num -= 200 return num

遇到的問題:

  • string的一些常用方法。 1.字串string是python中最常用的資料型別,一般用引號’‘或者““來建立字元。例如: var1 = "hello yueqi"字串string是python中最常用的資料型別,一般用引號’'或者““來建立字元。例如: var1 = “hello yueqi”。 2.python訪問字串中值時候,是從0開始的,最後一位不算進去。要用for in range 遍歷的時候,需要注意。

  • python中關於string的查詢: 1.name.count(‘x’)查詢某個字元在字串裡面出現的次數 2.name.find(‘x’)找到這個字元並返回下標,多個時候返回第一個;不存在的字元返回-1。 3.name.index(‘x’)找到字元的返回下標,多個時候返回第一個;不存在時候報錯。 4.in就是我在例程中用的,不返回任何值,只是一個操作符。在這題裡非常適用,因為不需要任何返回值,只需要判斷true和false。

  • 字典DIictionary的用法 1.查詢表非常方便,很適合一對一的形式。{‘Yueqi’: 95, ‘qiyue’:85, ‘qiqi’:75}, ''裡面的值是key, 後面的對應value。 2.dict.get(key) 或者 dict[key] 都可以找到value

資料結構

第五章 串

串(String)是由零個或者多個字元組成的有限序列,又名叫字串。 一般記為s=”a1a2….an”(n>=0),s是串的名稱,用的雙引號括起來的字元序列是串的值。ai(1<=i<=n)可以是字母,數字或者其他字元,i就是該字元在串的位置。串中的字元數目n稱為串長度。零個字元的串稱為空串(null string),長度為0.

5.1串的比較

給定倆串: s=”a1a2….an”, t=”b1b2….bm”,當滿足下列條件之一,s<t。

  1. n<m且ai=bi(i-1,2,…,n)
  2. 存在某個k<=min(m,n),使得ai=bi(i-1,2,…,k-1),ak<bk

5.2 串的抽象資料型別

串的邏輯結構和線性表很像,但是串針對的是字符集,也就是串中元素都是字元。 對於串基本操作與線性表有很大差別。線性表更關注單個元素的操作,比如查詢插入刪除一個元素,串更多的是查詢子串的位置,得到指定位置子串,替換子串等。來一個操作index的演算法(找目錄的): 在這裡插入圖片描述

5.3 串的儲存結構

5.3.1 串的順序儲存結構

是用一組地址連續的儲存單位來儲存串中的字元序列的。按照預定義大小,為每個定義的串變數分配一個固定長度的儲存區。一般用定長陣列來定義的。

一般將實際的串長度值儲存在陣列的0下標位置,有時也會定義在陣列的最後一個下標,還有些覺得填數字麻煩,規定在串值後面加一個不計入串長度的結束標記字元,”\0”來表示串值的終結。

但其實這樣,也是有很多侷限的,兩串連線,插入,替換等,都會超出Maxsize。比如一些老手機發簡訊時,超過一些字數就不能再打字了。 在這裡插入圖片描述

5.3.2 串的鏈式儲存結構

與線性表是相似的,但是由於串結構的特殊性,結構中的每個元素資料都是一個字元,如果簡單的應用連結串列儲存串,一個結點對應一個字元,會浪費很大。因此一個結點可以存放一個字元,也可以存放多個,最後一個結點若是沒被佔滿,可以用“#”或別的字元補全。

5.4 KMP模式匹配演算法

樸素的模式匹配會進行重複的比較,挨個便利,效率極差。Kmp演算法,可以節省運算時間和遍歷次數。

舉個例子:主串 S=abcdefgabS= “abcdefgab”, 匹配的T=abcdexT=”abcdex” 樸素演算法在這裡插入圖片描述

  1. 前5個字母,兩個串完全相等,直到第6個字母,"f"與"x"不等,才會往右挪動一格。
  2. 接下來的流程是圖2 3 4 5 6。即主串SS中當i=2,3,4,5,6時,首字元與子串TT的首字元均不等。 但是,發現對於要匹配的子串t來說,“abcdex“首字母"a"與後面的串“bcdex“中任意一個字元都不相等。也就是說,既然"a"不與自己後面的子串中任何一個字元相等,對於圖1來說,前五位相等必然意味著子串TT的首字元"a"必然不可能和SS串的第2到5位字元相等。所以圖2 3 4 5判斷都是多餘的。

KMP模式匹配演算法核心: 我們只保留了第一步和第六步,是因為T[2]=S[2],T[3]=S[3],T[4]=S[4],T[5]=S[5]T[2]=S[2], T[3]=S[3], T[4]=S[4], T[5]=S[5]。但我們並不能判斷T[6]=S[6],所以需要再次判斷。

如果T串後也含有首字元"a"的字元該怎麼辦?

例子2:假設S=&quot;abcabcabc&quot;,T=&quot;abcabx&quot;S=&quot;abcabcabc&quot;, T=&quot;abcabx&quot;

  1. 經過前面的判斷,前5個字元完全相等,第6個字元不等。上例是直接跳到S[6]S[6]進行比較。但是此例T[1]=T[4]T[1]=T[4], 只能省下圖2 3 。(因為不能判斷T[4]後面是不是和S[4]後面一樣) 在這裡插入圖片描述
  2. 因為T[1]的"a"與T[4]"a"相等,T[2]的"b"與T[5]"b"相等,且在第一步T[4],T[5]已經和S相應位置比較過了是相等的,所以圖4 5 也可以省略了。 如圖: 在這裡插入圖片描述

對比上述兩個例子,發現在圖1時,i值,也就是主串當前位置的下標為6,圖2 3 4 5時,i=2,3,4,5。到了6時,i重回6。在樸素模式匹配演算法中,主串i值是不斷回溯完成的。

KMP模式匹配演算法避免了這種不必要的回溯。既然i不可以變小,剩下要考慮的就是j值了。T串的首字元與自身後面字元的比較,發現如果有相等字元,j值變化就會不相同。eg1中,因為T="abcdex"當中沒有任何重複的字元,所以j由6變成1。eg2中,因為T="abcabc"中"ab"有重合,因此j由6變成了3。

我們把T串各個位置的j值變化定義為一個數組next,那麼next的長度就是T串的長度。於是可以得到下列函式定義: 在這裡插入圖片描述

next陣列值推導案例:記住是從s第一位開始的陣列進行比較

  1. 無重複的 在這裡插入圖片描述
  2. 有兩個重複 在這裡插入圖片描述
  3. 很多個重複 在這裡插入圖片描述

統計

第六章 統計量及其抽樣分佈

6.1 統計量

6.1.1 統計量的概念

實際應用中,當從某總體中抽取一個樣本(X1,X2,...,Xn)(X_1, X_2, ..., X_n)後,並不能直接應用它去總體的有關性質和特徵進行推斷,這是因為樣本雖然是從總體中獲取的代表,含有總體性質的資訊,但仍然是比較分散的。(grab需要的特徵?)

為了使統計推斷成為可能,首先必須把分散在樣本中我們關心的資訊收集起來,針對不同的研究目的,構造不同的樣本函式。

定義: 設X1,X2,...,XnX_1,X_2,... , X_n是從總體XX中抽取的容量為n的一個樣本, 如果由此樣本構造一個函式T(X1,X2,...,Xn)T(X_1, X_2, ..., X_n), 不依賴於任何未知引數,則稱函式T(X1,X2,...,Xn)T(X_1, X_2, ..., X_n)使一個統計量。 通常,又稱T(X1,X2,...,Xn)T(X_1, X_2, ..., X_n)為樣本統計量。當獲得樣本的一組具體觀測值x1,x2,...,xnx_1, x_2, ..., x_n時,帶入TT, 計算出T(x1,x2,...,xnT(x_1, x_2, ..., x_n的數值,就獲得一個具體的統計量值。

統計量是樣本的一個函式,可以有多個(E(X),D(x)不是,要依賴於總體分佈的) 。由樣本構造具體的統計量,實際上是對樣本所含的總體資訊按照某種加工要求進行加工處理,把分散在樣本中額資訊集中到統計量的取值上,不同的統計推斷問題要求不同統計量。

6.1.2 常用統計量

在這裡插入圖片描述

6.1.3 次序統計量

X1,X2,...,XnX_1,X_2, ..., X_n是從總體XX中抽取的一個樣本, XiX_i稱為第i個 次序統計量,它是樣本(X1,X2,...,Xn)(X_1,X_2, ..., X_n)滿足如下條件的函式:每當樣本得到一組觀測值(x_1,x_2, …, x_n)時,其由小到大的排序x(1)x(2)...x(i)...x(n)x_{(1)}\leq x_{(2)}...\leq x_{(i)}\leq ... \leq x_{(n)}中,第i個值x(i)x_{(i)}就作為次序統計量X(i)X{(i)}的觀測值,而X(1),X(2),...,X(n)X_{(1)},X_{(2)}, ..., X{(n)}稱為次序統計量。其中,X(1)X_{(1)}X(2)X_{(2)}分別為最小和最大次序統計量。

R(n)=X(n)X(1)R_{(n)}=X_{(n)}-X_{(1)}稱為樣本極差。極差反映出樣本中最大值與最小值的差距,但損失了樣本的中間資訊。

6.1.4 充分統計量

前面我們由樣本構造了一個統計量,可以看出,樣本統計量T的構造過程就是對樣本根據要求進行加工的過程。我們希望在構造統計量的過程中儘可能保留樣本中有關總體的資訊。

在統計學中,介入一個統計量能把含在樣本中有關總體的資訊一點都不損失的提取出來,那對保證後邊的統計推斷質量具有重要意義。統計量加工過程中一點資訊都不損失的統計量稱為充分統計量。 在這裡插入圖片描述### 6.2 關於分佈的幾個概念

6.2.1 抽樣分佈

在總體XX的分佈型已知時,若對任一自然數n,都能推匯出統計量T=T(X1,X2,...,Xn)T=T(X_1,X_2, ..., X_n)的分佈的數學表示式,這種分佈稱為精確的抽樣分佈。它對樣本量n較小的統計推斷問題非常有用。

精確的抽樣分佈大多是在正態總體情況下得到的,在正態總體條件下,主要由X2X^2分佈,tt分佈,FF分佈,常稱為統計三大分佈。

6.2.2 漸近分佈

在統計學的抽樣分佈理論中,至今求出的精確抽樣分佈不多。通常,精確抽樣不僅難獲得,也過於複雜了。所以藉助極限工具,尋求在樣本量n無限大時,統計量T(X1,X2,...,Xn)T(X_1,X_2, ... , X_n)的極限分佈,常稱為漸近分佈。

6.2.3 隨機模擬獲得的近似分佈

實際應用中,很多問題要尋求精確分佈和漸進分佈都很難。可用計算