一 處理流程
1.讀取txt內容。
2.句子拆分
3.解析出姓名,以及每人對應說的話
4.輸出全部姓名,將文字語言轉換成程序邏輯
5.計算出有多少組合可能
二 詳細分析
1.??讀取txt內容,去除換行符,拼接成一個字符串
2.將字符串拆分成句子。拆分可以以? ! . 三個符號就行拆分。注意,這三個符號可能會在雙引號""里,要特殊邏輯處理下,如果這句中只有一個引號,且下一句開頭是引號,那么這個引號是前一句的。
當然最好都加入些異常處理,例如txt讀取失敗,或者格式不對,那么直接返回no solution。
3.獲取所有出現的名字,按照要求里說明的,除了句子開頭,和Sir/Sirs 以外首字母大寫的都是名字,當然還有I也不是名字。可以將名字用set存儲(去重),同時用一個dictionary存儲名字和他所對應說的話,這里的話是指雙引號內的句子,例如{A:["I am a knight","all
of us are knight"],B:[“I am a knight”]},每個人會對應多句,所以value用list.
處理到這里已經可以獲取到全部的名字。記得要排序和輸出格式,大于一個用Sirs,等于一個用Sir。
4.將3里處理好的dictionary中的自然語言轉換成程序語言,雙引號里的情況就是要求的那8種。這里可以用一個dictionary,key為人名,value還是一個dictionary,里面存放我們設計好的key。例如
key:all-knight,里存放全部被描述為knight的名字,對應為”all of us are knight”,? ”I am a knight”,”Conjunction_of_sirs areknights”,”Sir sir_name is a knight”。
同理all-knave把上面的knight替換為knave。
Key:one-least-knight/one-least-knave對應為,“at least …”,“Disjunction_of_Sirs”
Key:one-most-knight/one-most-knave對應為“at most …”
Key:exactly-one-knight/exactly-one-knave,對應為“exactly one”
對應的value存儲名字,可以用set,
如何分析文字語言對用到哪個組別里,可以用正則re,或者直接關鍵詞判斷,例如:
通過most in ,exactly,in ,least in 其他4種場景處理,
名字的處理與3中一樣,注意us 和 I的映射
對于all-knight 直接場景直接加入到set
one-least場景,例如 存在A or Bor C is knight? 和 A or B is knight,那么處理的結果為 只要滿足 A or B is knight即可,C為什么不影響判斷,那么one-least是取交集
one-most場景?A B? 最多有一個knight.? A B C最多一個knight,那么需要滿足 A B C最多一個knight,即取并集
exactly-one場景 A B C 只有一個knight A B 只有一個knight,那么需要滿足A B 只有一個knight C 為knave,即取交集保留到exactly-one,差集加入到all_knave
5. 根據4得到的dictionary進行計算有多少滿足條件的組合,每人都有兩種可能要那么為knight 要么為knave,如果有n個人,那么就有2^n種可能。獲取全部可能然后依次帶入到4中的條件限制內,如果A 為knight,那么所有的條件返回的結果都為true,否則都為false,得到滿足的情況。
其中全集的獲取可以利用二進制,例如 存在3個人,那么有2^3=8種場景,那么對用為0-7,的二進制000 ---- 111 ,可以用0 表示 knight 1 表示knave。
?按照以上處理流程,即完成了ass1.
?三 優化
上面5中,存在優化空間。
1)??????存在n個人,那么生成的全量為2^n,同時存在m個限制條件,那么時間復雜度為m*(2^n) 的時間復雜度。考慮test_2.txt的場景,Frank Nina Paul 三個人,存在限制條件的只有Nina,那么就意味著Frank,Paul是什么身份都不影響最后的結果,那么只需要獲取Nina的可能性為knight 或knave,得到兩種可能,在乘上2^2 = 4 (每人兩個可能,兩個人Frank,Paul)最后答案為8個solution.
2)?????? 上面只是減少了n的大小,但2^n的數量空間還是沒變。這時候考慮用剪枝的方式,例如 存在8種可能 分別為
000 001 010 100 011 101 110 111 三種情況,那么先判斷第一個人為0是否滿足條件,如果不滿足,那么上面所有0開頭的場景都可以排除。
3)?????? 讓2)中更早的剪枝掉不滿足要求的情況,那么先處理容易確認性的判斷,在處理不容易判斷的場景
4)?????? 2)3)解決了時間復雜度的問題,但空間復雜度仍未2^n,那么可以用棧來解決空間復雜度
?四 考點總結
1.?? txt文件的讀取
2.??字符串分割
3.?? 集合 交集 并集 差集
4.?? 全排序,剪枝,棧的運用