Problem
類似 UVa 10304 - Optimal Binary Search Tree,給每個節點的拜訪頻率,建造一個二元樹,使得詢問次數最小化。
Sample Input
|
|
Sample Output
|
|
Solution
套用四邊形不等式進行優化。
|
|
類似 UVa 10304 - Optimal Binary Search Tree,給每個節點的拜訪頻率,建造一個二元樹,使得詢問次數最小化。
|
|
|
|
套用四邊形不等式進行優化。
|
|
類似 UVa 10720 - Graph Construction,給一個無向圖的每一個節點 degree,請問是否能構成圖。
|
|
|
|
使用公式加二分。
|
|
給一個序列 A,請問在 A[l:r] 中 A[i] 不被 A[j] 整除的個數為何。
|
|
|
|
首先先貪心 A[i],找到左側最鄰近的因數、右側最鄰近的因數的位置找出 L[i], R[i]。
以下使用 binary indexed tree 進行區域操作。
然後對於詢問 [l, r] 事先讀進來,加入掃描線算法,確保能夠詢問 [l, r] 時,找尋 BIT[r] 的值為何。
掃描時,當我們遇到某個因數所展開的區間 [L[i], R[i]] 的左端點
因此資料結構要維護
|
|
找到 Ax + By + Cz = P, 給定 A, B, C, P,要求 (x, y, z) 有幾組解,並且 x >= 0, y >= 0, z >= 0。
|
|
|
|
看一下數據範圍 0 < A, B, C, P <= 100000000,C / gcd(A, B, C) >= 200,後者是強而有力的條件,肯定 z 情況最多 100000000/200 = 500000 個可能,窮舉 z 的情況,用擴充歐基里德找到 Ax + By = (P - Cz) 的解個數。
|
|
在一個迷宮中有 M x N 個房間,每個房間有四個門,並且以逆時針的順序依次出現,每一個時間每個房間只會有一個門通往另一個地方。
必須從左上角開始,花最少時間收集到 K 個寶物後抵達右下角。
|
|
|
|
分析狀態,由於 K 不大,直接 2^K 狀態下去,而只會有四個門,因此時間論替只需要考慮 mod 4 的結果,最後 dist[x][y][4][1<<8]
抵達 (x, y) 時的門狀態、同時身上帶了多少寶物 (用 bitmask 去壓縮)。
BFS 一下就過去,記得要注意可以在同一個房間內等待下一個時刻。
|
|
|
|
會將三點一線段的中間那一點替除掉,直到一個線段上只經過兩個點。
*$O(n^{2})$ incremental LP problem,每加入一個半平面,都必須重新計算最佳交集。
|
|
找到其中一邊的 split node 的寫法如下:
|
|
最後我們找到兩個 split node [1], [7]
,在兩個 split node 之間的葉節點都是答案,對於葉節點可以利用建造時,使用一個 linked list 去完成。
1.$\text{if } log_{b}a < c, T(n) = \theta(n^{c})$
2.$\text{if } log_{b}a = c, T(n) = \theta(n^{c} log n)$
3.$\text{if } log_{b}a > c, T(n) = \theta(n^{log_{b}a})$
1.$\text{if } f(n) = O(n^{E} (log_{b}n)^{\alpha} ) \text{ and } \alpha < -1, T(n) = \theta(n^{E})$
2.$\text{if } f(n) = O(n^{E} (log_{b}n)^{\alpha} ) \text{ and } \alpha = -1, T(n) = \theta(n^{E} log_{b} log_{b}(n))$
3.$\text{if } f(n) = O(n^{E} (log_{b}n)^{\alpha} ) \text{ and } \alpha > -1, T(n) = \theta(n^{E}(log_{b}n)^{\alpha + 1})$
In the proof of the query time of the kd-tree we found the following
recurrence:
$$Q(n) =
\begin{cases}
O(1) & \text{ if } n = 1 \\
2 + 2Q(n/4)& \text{ if } n > 1
\end{cases}$$
Prove that this recurrence solves to Q(n) = O(√n). Also show that Ω(√n) is a lower bound for querying in a kd-tree by defining a set of n points and a query rectangle appropriately.
|
|
In Section 5.2 it was indicated that kd-trees can also be used to store sets of points in higher-dimensional space. Let P be a set of n points in d-dimensional space. In parts a. and b. you may consider d to be a constant.
|
|
Algorithm SEARCHKDTREE can also be used when querying with other ranges than rectangles. For example, a query is answered correctly if the range is a triangle.
a. Show that the query time for range queries with triangles is linear in the worst case, even if no answers are reported at all. Hint: Choose all points to be stored in the kd-tree on the line y = x.
b. Suppose that a data structure is needed that can answer triangular range queries, but only for triangles whose edges are horizontal, vertical, or have slope +1 or −1. Develop a linear size data structure that answers such range queries in O(n3/4+k) time, where k is the number of points reported. Hint: Choose 4 coordinate axes in the plane and use a 4-dimensional kd-tree.
c. Improve the query time to O(n2/3+k). Hint: Solve Exercise 5.4 first.
One can use the data structures described in this chapter to determine whether a particular point (a,b) is in a given set by performing a range query with range [a : a]×[b : b].
Let S1 be a set of n disjoint horizontal line segments and let S2 be a set
of m disjoint vertical line segments. Give a plane-sweep algorithm that
counts in O((n+m) log(n+m)) time how many intersections there are
in S1 ∪ S2.
給 n 個不相交的水平線段、m 個不相交的垂直線段,在 O((n+m) log (n+m)) 的時間內找到焦點個數。
|
|
Draw the graph of the search structure D for the set of segments depicted
in the margin, for some insertion order of the segments.
雖然沒有加入順序的考量,但是手爆一個 17 個線段、平面空間 29 個的建造 … 也許有點瘋狂,用最簡單的由上而下掃描,造成一個傾斜的樹也是各種不容易。
Give an example of a set of n line segments with an order on them that
makes the algorithm create a search structure of size Θ(n2) and worst-case
query time Θ(n).
找到一個最慘空間$\Theta(n^{2})$,最慘詢問時間$\Theta(n)$。
n 個線段,將其中 n/2 放置在同一個水平線上,對於剩餘 n/2 個:
每次加入的順序 s1, s2, …, si,每次的線段的 x 值會包含前一個線段$s_{i}.lx < s_{i-1}.lx, s_{i}.rx > s_{i-1}.rx$,美加入一個線段,會增加 n/2 個內部節點,並且最大深度增加 1。總計加入 n/2 次,增加的節點數量 O(n/2 x n/2) = O(n^2),深度 O(n/2) = O(n)。
Given a convex polygon P as an array of its n vertices in sorted order along the boundary. Show that, given a query point q, it can be tested in time O(logn) whether q lies inside P.
由於詢問次數相當多,必須將複雜度降到 O(log n),採用的方式將凸包其中一個點當作基準,則如果在凸包的點而言,一定會落在某個以基點拉出的三角形內部中,為了方便計算,則可以拿外積的正負邊界上。得到可能的三角形後,從邊界中可以藉由外積計算是否同側。
採用射線法 O(n) 肯定是吃大虧的。
|
|
Dev-C++ 5.6.3
實作語言處理模型,要求讀入一連串的英文語句做為基底,接著詢問一句的正確性為多少,也就是這句話是正確拼讀的機率為何,算是一個可用的句子嗎?
$$P(w_{i}) = \frac{Count(w_{i})}{\sum_{j} Count(w_{j})} \\ P(w_{i}, w_{i+1}) = \frac{Count(w_{i}, w_{i+1})}{\sum_{j} Count(w_{j}, w_{j+1})} \\ P(w_{i+1}|w_{i}) = \frac{P(w_{i}, w_{i+1})}{P(w_{i})}$$上述分別是一個單詞的機率,以及計算相鄰兩個單詞的機率,最後推估在這個單詞下,它們相鄰的機率。請查閱 貝氏定理 。
$P(s) = P(w_{0}) \times P(w_{1}|w_{0}) \times ... \times P(w_{n-1}|w_{n-2})$
- P(A)是A的先驗機率或邊緣機率。之所以稱為”先驗”是因為它不考慮任何B方面的因素。
- P(A|B)是已知B發生後A的條件機率,也由於得自B的取值而被稱作A的後驗機率。
- P(B|A)是已知A發生後B的條件機率,也由於得自A的取值而被稱作B的後驗機率。
- P(B)是B的先驗機率或邊緣機率,也作標准化常量(normalizing constant).
上述為一個句子的機率,一個句子可以表示成一個序列單詞,利用連乘積將機率算出。當句子越常時,很容易發現機率陡降的速度相當快,就算是數個字詞,機率大約也是在$10^{-3}$ 左右。因此這麼算下去,長句子的正確性就會大幅減少,但是在邏輯上,如果句子都是短短幾個單詞也是相當奇怪的,口語上也許是,文章判讀上就難說。至於要不要取$\sqrt[n]{x}$ 值得思考。
$$\begin{cases} Count^{*}(w_{i}) = (Count(w_{i})+1) \times \frac{N_{Count(w_{i})+1}}{N_{Count(w_{i})}} & \text{ if } Count(w_{i}) < k \\ Count^{*}(w_{i}) = Count(w_{i}) & \text{ if } Count(w_{i}) \geq k \end{cases} \\ \text{unigram } N_{0} = 80000$$當我們去計算一個單詞的機率時,必須相對於其他單詞的出現機率,然而像介係詞、助詞等,出現次數是相對高出取多,必須取一個閥值,來忽略過高無用的機率,以免將其他的單詞的機率過低不均。
$$\begin{cases} Count^{*}(w_{i}, w_{i+1}) = (Count(w_{i}, w_{i+1})+1) \times \frac{N_{Count(w_{i}, w_{i+1})+1}}{N_{Count(w_{i}, w_{i+1})}} & \text{ if } Count(w_{i}, w_{i+1}) < k \\ Count^{*}(w_{i}, w_{i+1}) = Count(w_{i}, w_{i+1}) & \text{ if } Count(w_{i}, w_{i+1}) \geq k \end{cases} \\ \text{bigram } N_{0} = 80000 \times 80000$$在計算相鄰兩個單詞的出現次數時,一樣會遇到這種情況。既然在計算次數上需要做 smoothing 的調整,在機率處理上也是一樣動作。
$$\begin{cases} P(w_{i}) = \frac{N_{1}}{N} & \text{ if } Count(w_{i}) = 0 \\ P(w_{i}) = \frac{Count^{*}(w_{i})}{N} & \text{ if } Count(w_{i}) < K \\ P(w_{i}) = \frac{Count(w_{i})}{N} & \text{ if } Count(w_{i}) \geq K \end{cases}$$ $$\begin{cases} P(w_{i}, w_{i+1}) = \frac{Count^{*}(w_{i}, w_{i+1})}{N} & \text{ if } Count(w_{i}, w_{i+1}) < K \\ P(w_{i}, w_{i+1}) = \frac{Count(w_{i}, w_{i+1})}{N} & \text{ if } Count(w_{i}, w_{i+1}) \geq K \end{cases}$$在單詞出現次數很少時,就必須使用 smoothing,因為出現 1 次、2 次、3 次 … 的單詞次數,之間大小關係不保證嚴格遞增或遞減,
原則上,讀檔案,建立模型可以在 1.4 秒內完成
|
|
|
|
考量長句子的機率,採用 log 平均結果,輸出應該為負值。
|
|
原始版本,直接輸出 P(s),這裡採用科學記號表示法。
|
|
有 STL library,代碼不用太長,跑得時間也不會太久。想到插手別學校的自然語言處理,玩了一下他們作業,把同學的代碼效率修得好一點,其實也不錯玩得,只是在公式計算上比較沒有,但是要求高效率的搜索結構,讀檔案進來後,依據什麼建表、該用什麼順序完成是很重要的。
切記,在寫這種程式時,發現跑的速度太久,一部分是因為使用太多的標準輸出,也就是用太多 printf()
、cout <<
或 System.out.println()
之類的在進行流程監控。輸出的效率必須將檔案寫到螢幕顯示的 memory buffer,因此 context-switch 什麼,消耗時間太大,盡可能不要輸出,要不然就是按比例輸出,速度可以快個數百倍。
|
|
文明化的過程,有可能整個記憶封鎖在過去的盒子中。
本周上課講述的內容為 痰盂 ,在 18 世紀時,這盆子可說是相當受到歡迎,當我們發現吐痰這事衛生上有所疑慮,找了一個盆子還裝,就跟尿壺類似。但是問別人痰盂是何物時,大概也沒幾個人見過。
為什麼經過了 2 個世紀,痰盂就不見了,應該說是不被需要, 吐痰 這件事從正常行為,到不需要吐痰,當然還是有人或在某個狀態下會吐痰 (生病),由於環境的改善,尤其是空氣汙染的關係,痰並沒有必要性。
早期到處可見吐痰,可說是隨地大小便的程度,吐痰在地上踏踏輾輾即可,中間開始注意到衛生,不管東方西方都曾出現過 痰盂 ,甚至在大大小小的照片中還一起入鏡呢,外觀上與一般花盆無異,只是裡面裝的東西不同罷了。
後來開始用法規、法款來制止人們隨地吐痰,從不吐在室內開始,也許允許往外吐是件很可笑的事情,但是在過度時期也算個進步,至少人們還知道吐痰這個行為需要被約束。到了二十世紀仍然會有使用罰款的方式來告誡人們,那為什麼現在根本沒有看過這些警告標語呢?「 請不要隨地吐痰 」
他制到自制:外部或他人而遵守戒律 → 內化到自我強制
任何一個爛事,找一個 powerful 的理由,也能昇華!
在一個民主平等的社會中,才能用衛生健康的理由來約束人們。如果在那種貧富不均,又有階級高低之分的社會,物質分配不均,光是活著就有困擾,遵守禮儀這件事情何止奢侈可說。
如果看看在傳統菜市場買賣的人,用呼喊的方式叫賣,那樣的行為舉止,在有限的資源下,你還說什麼禮儀嗎,能賣出去就好,下次還要搶攤位賣呢。
社會組織的方式將會影響心理生活的可塑性,根據國情不同、情操與行為的主旨不同,心理上要適應新的規則模式,反應上也會有所不同。基於什麼樣的條件,接受某些事情的難易度不同。 (文理組織差,相互學習對方領域的可塑性也會有差別)
美當我們成長,越來越會覺得小孩子很吵,那我們還能這麼吵嗎?兇不起來的人類?越來越退化了嗎?接受禮儀的約束,在何種環境下,才能拿回被約束的習慣。
「當我們不只遵守禮儀,也會開始要求別人遵守禮儀」這必須看看台灣最強的人肉搜索,不外乎一個人做錯事情,馬上就會被人肉出來,必且大眾強力苛責這個人的行為,可見我們多麼要求別人遵守禮儀。在某些條件下,例如家裡、年紀之差,容忍不禮貌的程度也會不同。
結合民族自尊心推動宣傳,當我們厭惡、崇尚其他民族時,它們活生生的例子就會是很好的宣傳,例如:西方人多麼高雅、韓國人常在體育賽事作弊 … 等,約束力相當好。
在早期哪有什麼裸體抗議,大家都是赤裸裸地睡覺、洗澡,不赤裸睡覺必有身體上的缺陷,不想引人猜疑,那時都是安妥妥地赤裸。而現在卻不同,赤裸居然可以拿來做為抗議手段,用一個羞恥力來擊倒敵人!
在人來人往的地方生活,就會不由自主地意識到他人的存在,任何行為不管是否被他人看見,都會論及自己是否會 貶值 的行為,做了某件事情,我是否就貶值了呢?因此焦慮心情在城市中也常在人們身上發現。
成人與小孩的衝突有時只是世代的價值衝突,而非禮儀上的學習多寡,當沒有過去世代的記憶,沒有那些曾經被拋下的某些行為經驗,不知道不做的原因,為何不做?
為什麼常有人不碰別人用過的東西?人際關係的 獨立 與 疏離 ,總覺得人越來越不是人了,說是昆蟲也不為過,之後就各自獨立生存,最終進化呢。
沒有一個時代的狀態可以做為 絕對化標準
少在那邊自己為是,可以說自己不夠好,但是絕不能批評別人太差,看到別人用你不曾使用的行為模式活著,才是訝異敬佩的地方-「 原來還可以這麼活著! 」
用範例教育成人該做、不該做的事情,也就是說什麼都能說,何必忌諱任何一個汙穢的事情。
越要說明一個真理,請拋開羞恥心去描述它吧。
每到吃飼料時間,某 M 正思考要去哪裡解決,雖然有很多很多地方可以去吃,由於某 M 對於美食沒有特別需求,所以只會到最近的幾個地點即可,然後再以循環輪食的方式日復一日。
某 M 現在的位置與每個餐館的位置都用一個笛卡爾坐標系中的點表示,每個點與每個點的距離為歐幾里得距離。
x = (x1,…,xn) 和 y = (y1,…,yn) 之間的距離為
現給出在 K 維空間中某 M 所處的位置座標,以及 N 個餐館位置,請觀察某 M 會到哪裡吃飼料。.
輸入有多組測資,
每一組第一行會有兩個整數 N, K,
接下來會有 N 行,每行包含 K 個整數,表示第 i 個餐館座標。
接下來一行,包含一個整數 Q,表示某 M 的可能座標 。
接下來會有 Q 行,每一組詢問會有兩行,第一行會有 K 個整數,表示某 M 所在的座標,第二行會有一個整數 P。
(N < 8192, K < 6, Q < 10,000, P < 11, 座標值 0 < x, y < 10,000)
對於每一組詢問,輸出一行 Case #:
,第一個整數為 P,接下來 P 個整數按照距離由小到大輸出餐館編號,如果相同則輸出編號小的。
|
|
|
|
|
|