<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Thomas Anderson on Medium]]></title>
        <description><![CDATA[Stories by Thomas Anderson on Medium]]></description>
        <link>https://medium.com/@t1neo?source=rss-100996510918------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*187STx42-0UrajffwNGKxQ.png</url>
            <title>Stories by Thomas Anderson on Medium</title>
            <link>https://medium.com/@t1neo?source=rss-100996510918------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 07:44:14 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@t1neo/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[碰巧用了點推理找回遺失的東西]]></title>
            <link>https://medium.com/@t1neo/%E7%A2%B0%E5%B7%A7%E7%94%A8%E4%BA%86%E9%BB%9E%E6%8E%A8%E7%90%86%E6%89%BE%E5%9B%9E%E9%81%BA%E5%A4%B1%E7%9A%84%E6%9D%B1%E8%A5%BF-6db404b45366?source=rss-100996510918------2</link>
            <guid isPermaLink="false">https://medium.com/p/6db404b45366</guid>
            <category><![CDATA[bluetooth]]></category>
            <category><![CDATA[math]]></category>
            <dc:creator><![CDATA[Thomas Anderson]]></dc:creator>
            <pubDate>Tue, 23 Apr 2024 15:34:57 GMT</pubDate>
            <atom:updated>2024-04-23T15:34:57.880Z</atom:updated>
            <content:encoded><![CDATA[<p>2024/04/24 推特上面的這篇</p><p><a href="https://twitter.com/nenerushimo1919/status/1781853587032903820">(1) X 上的 ꒰ঌなんじゃこりゃてゃ໒꒱┃ お前の親友：「ワイヤレスイヤホン片方だけ落としたんだけど、落ち着いてBluetoothをONにして、来た道を辿っていったらまさかの接続！そこからその周りを散策して、接続がちょうど切れた点を3点探して、その3点を結ぶ三角形の外心あたりでワイヤレスイヤホンを発見‼️🤩🤩🤩見つけた時脳汁止まらんかった(実話) https://t.co/nysI2dBgB9」 / X (twitter.com)</a></p><p>看起來是東大理科生.</p><p>簡單的說就是利用不同的失去藍牙訊號位置, 找出圓心.</p><p>他取三個點, 剛好滿足理論上的情況, 也就是三角形的外心.</p><p>我在2024/04/22發生了類似的事情, 但沒有那麼神.</p><p>首先運氣很差的連續兩天在健身房流血.</p><p>第二天要離開時, 要拿安全帽, 去原本印象中放的櫃子找, 居然上鎖了(我放的時候沒上鎖). 這區櫃子的門有一個小透明塑膠, 可以看到裡面放什麼, 看了一下我的安全帽確實不在裡面. 於是我就把我平常有可能放的那區櫃子通通能開的就開, 確認我是不是記錯, 但還是沒找到.</p><p>於是報警, 等警察來才可以調監視器, 雖然不一定看得到. 等警察的時候, 發現手機跟安全帽上的藍牙耳機還在連線中(剛好那天忘記關), 應該還在同一層樓, 後來就去翻別區的櫃子, 就找到了, 那邊我從來不會放. 又遇到一個沒水準的人, 金梅送.</p><p>不過在不是太大的建築物內, 以現在的藍牙連線距離, 可能無法複製東大生的做法lol.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6db404b45366" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Python Sorted Containers讓我有點意外的小發現]]></title>
            <link>https://medium.com/@t1neo/python-sorted-containers%E8%AE%93%E6%88%91%E6%9C%89%E9%BB%9E%E6%84%8F%E5%A4%96%E7%9A%84%E5%B0%8F%E7%99%BC%E7%8F%BE-9b2582f6c0cb?source=rss-100996510918------2</link>
            <guid isPermaLink="false">https://medium.com/p/9b2582f6c0cb</guid>
            <category><![CDATA[sorted-containers]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[python]]></category>
            <dc:creator><![CDATA[Thomas Anderson]]></dc:creator>
            <pubDate>Tue, 17 May 2022 10:24:48 GMT</pubDate>
            <atom:updated>2022-05-17T10:24:48.799Z</atom:updated>
            <content:encoded><![CDATA[<p>Sorted Containers是一個python的open source lib, not built-in.</p><p>在資料會新增/刪除的情況下, 如果希望一直保持著整體的有序性, 那麼Sorted Containers (or Sorted Collections)是個選擇.</p><p>譬如想在一個python list中加入許多數字, 每次加入都要維持順序.</p><p>在加入的過程中可能會要知道現在的最大最小值, 或著第i大的值.</p><p>甚至其他需要知道中間某些數值的操作, 就不能全部加完再排序.</p><p>原本直接用built-in的作法可能是:</p><p>使用bisect module, insort_left()/insort_right()插入.</p><p>每次insort要移動位置在插入數字後的其他數字, 一次時間複雜度是O(n)</p><p>所以整體的時間複雜度會來到O(n²)</p><p>general一點, 如果想解決的問題, 在整個操作過程中可能會需要</p><ol><li>找最大最小值(or i-th value)</li><li>插入/刪除</li><li>查詢是否存在.</li><li>維持有序性</li></ol><p>希望將整體的時間複雜度降低, 就要將複雜度最高的降低.</p><p>通常是希望把O(n)的操作變成O(ln(n)), 但有時事情有取捨,</p><p>原本O(1)的操作可能會變得慢一點, 譬如也變成O(ln(n))</p><p>如果各種操作的機會是差不多的, 且n大到一個程度,</p><p>那這個trade off可能可以考慮.</p><p>一個比較常見的方法是使用平衡樹(紅黑樹, AVL之類的), 雖然查詢變慢了, 但插入刪除變快了.</p><p>python內應該是沒有built-in的平衡樹, 如果要解決像上面這樣的問題, 希望有差不多的時間複雜度, 可以試試Sorted Containers. 其實作方式應該不是平衡樹, 但有一些比較優秀的地方, 如記憶體使用, 因為不用儲存null的leaf pointers. 在官方文件第一頁有提到. 另外在下面還有提到</p><p><a href="https://grantjenks.com/docs/sortedcontainers/implementation.html">Implementation Details — Sorted Containers 2.4.0 documentation (grantjenks.com)</a></p><pre>Traditional tree-based designs have better big-O notation but that ignores the realities of today’s software and hardware.</pre><p>有興趣可以研究一下.</p><p>使用pip即可安裝, based on pure python, 官方文件有performace比較, 效率不錯, 也有覆蓋率很不錯的test. 雖然我還是碰到一點無傷大雅的bug.</p><pre>$ pip install sortedcontainers</pre><p>主要提供三種有序的containers, 用法文件裡面有範例, 還有各種估計的時間複雜度可以提供參考. 其中要注意 __contains__()/__getitem__()的時間複雜度, 可能與原本類似名稱的內建container不一樣.</p><p>簡單講一下幾個需要注意的點:</p><p>這些Sorted Conatiners都可以建立key function來決定排序方式, 但不能看到函數的詳細定義, 特別是使用lambda function時要注意. key function決定後無法修改.</p><p>SortedList:</p><ol><li>使用index取值的時間複雜度是O(ln(n))</li><li>discard()跟remove()的差別在前者在移除不存在的元素時不會raise error</li><li>沒有append()/extend()/insert(), 因為加入新的元素都有自己應該在的位置, 應該要用add(). 一次加入多個可以用update(), 或著使用</li></ol><pre>sl += some_iterable</pre><p><a href="https://grantjenks.com/docs/sortedcontainers/sortedlist.html">https://grantjenks.com/docs/sortedcontainers/sortedlist.html</a></p><p>SortedDict</p><ol><li>可以用index取值, 但要用peekitem(), O(ln(n))</li><li>插入/刪除是O(ln(n))</li><li>對key排序, 如果要對value排序, 請找Sorted Collections</li></ol><p><a href="https://grantjenks.com/docs/sortedcontainers/sorteddict.html">Sorted Dict — Sorted Containers 2.4.0 documentation (grantjenks.com)</a></p><p>SortedSet</p><ol><li>支援set的相關操作.</li><li>__contains__()/count()是O(1)</li></ol><p><a href="https://grantjenks.com/docs/sortedcontainers/sortedset.html">Sorted Set — Sorted Containers 2.4.0 documentation (grantjenks.com)</a></p><p>意外的小發現有三個</p><ol><li>Leetcode可以使用sortedcontainers. 這是一件有點奇怪的事, 照理說應該都要使用built-in才可以. 而且大多練習leetcode的人應該以面試為主要目的, 面試時能使用sortedcontainers的機會我想不高, 畢竟對方也不一定有用過.</li><li>三種Sorted Conatiners都有個共通的小bug, 但對使用不太有影響. index可以為0.0, -1.0(其他float不行), 但原本的python list index必須是整數, 連0.0, -1.0都不行.</li><li>另外不小心碰到一個無法重現的bug(on m1, 不確定有沒有關聯), 應該要不能加入無法比較的元素, 但我拿到error後還是加入了.</li></ol><p><a href="https://github.com/grantjenks/python-sortedcontainers/issues/193">SortedList with integers add char with error, but char added. (Don’t know how to reproduce.) · Issue #193 · grantjenks/python-sortedcontainers (github.com)</a></p><p>github:</p><p>grantjenks/python-sortedcontainers: Python Sorted Container Types: Sorted List, Sorted Dict, and Sorted Set (github.com)</p><p>doc:</p><p><a href="https://grantjenks.com/docs/sortedcontainers/">Python Sorted Containers — Sorted Containers 2.4.0 documentation (grantjenks.com)</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9b2582f6c0cb" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What if…? 多重宇宙?遇上分岔-branch prediction]]></title>
            <link>https://medium.com/@t1neo/what-if-%E5%A4%9A%E9%87%8D%E5%AE%87%E5%AE%99-%E9%81%87%E4%B8%8A%E5%88%86%E5%B2%94-branch-prediction-b4914f8232cc?source=rss-100996510918------2</link>
            <guid isPermaLink="false">https://medium.com/p/b4914f8232cc</guid>
            <category><![CDATA[branch-prediction]]></category>
            <category><![CDATA[what-if]]></category>
            <category><![CDATA[multiverse]]></category>
            <dc:creator><![CDATA[Thomas Anderson]]></dc:creator>
            <pubDate>Wed, 04 May 2022 15:59:04 GMT</pubDate>
            <atom:updated>2022-05-04T15:59:04.471Z</atom:updated>
            <content:encoded><![CDATA[<p>Sometimes我們總覺得一件事情變成這樣不只是始料未及,</p><p>更是這背後的行為讓我們覺得這是否一個平行世界, 多重宇宙, 失控多重宇宙.</p><p>在616宇宙是魔法, 在元宇宙是魔術.</p><p>code的世界也總是有些違反想法的結果, 即便排除設計錯誤的可能性, 也依然存在這現象.</p><p>原因依然是我對這世界不夠理解.</p><p>對一串數字, 如果數字大於等於門檻值, 我就丟到一邊加起來, 否則丟到另外一邊（流放組要不要加起來就隨意.）</p><p>直覺地想, 無論這一串數字有沒有排序過, 做這件事情需要花費的時間應該一樣.</p><pre>// whatif.c<br>#include &lt;stdio.h&gt;</pre><pre>#include &lt;stdlib.h&gt;</pre><pre>#include &lt;sys/time.h&gt;</pre><pre>#define ARRAY_NUM 200000</pre><pre>double time_diff(struct timeval x , struct timeval y)</pre><pre>{</pre><pre>double x_ms, y_ms, diff;</pre><pre>x_ms = (double) x.tv_sec * 1000000 + (double) x.tv_usec;</pre><pre>y_ms = (double) y.tv_sec * 1000000 + (double) y.tv_usec;</pre><pre>diff = (double) y_ms - (double) x_ms;</pre><pre>return diff;</pre><pre>}</pre><pre>int compare(const void* a, const void* b)</pre><pre>{</pre><pre>int int_a = *((int*) a);</pre><pre>int int_b = *((int*) b);</pre><pre>if (int_a == int_b)</pre><pre>return 0;</pre><pre>else if (int_a &lt; int_b)</pre><pre>return -1;</pre><pre>else</pre><pre>return 1;</pre><pre>}</pre><pre>int main()</pre><pre>{</pre><pre>srand(time(NULL));</pre><pre>int x[ARRAY_NUM];</pre><pre>int i, sum = 0;</pre><pre>struct timeval before , after;</pre><pre>for (i = 0; i &lt; ARRAY_NUM; ++i)</pre><pre>{</pre><pre>x[i] = rand() % 256;</pre><pre>}</pre><pre>// qsort(x, ARRAY_NUM, sizeof(int), compare);</pre><pre>gettimeofday(&amp;before , NULL);</pre><pre>for (i = 0; i &lt; ARRAY_NUM; ++i)</pre><pre>{</pre><pre>if (x[i] &gt;= 128)</pre><pre>{</pre><pre>sum += x[i];</pre><pre>}</pre><pre>}</pre><pre>gettimeofday(&amp;after , NULL);</pre><pre>printf(&quot;Total time elapsed : %.0lf us&quot;, time_diff(before , after));</pre><pre>return 0;</pre><pre>}</pre><p>以上檔案嘗試註解/取消註解qsort(), 配上編譯指令如</p><pre>clang -o whatif whatif.c</pre><p>會發現有排序過的求和會快上許多! Amazing!</p><p>*可以把編譯指令加上最佳化參數如 -O2試試.</p><p>用python寫一個類似的程式也會找到進入多重宇宙的分岔點.</p><p>多重宇宙的開端都是因為蜘蛛人想要重新開始安寧的生活, 所以有了</p><p>branch prediction…</p><p>我對這世界不夠理解.</p><p>簡言之</p><p>“What if you guess right, then you will be fast.”</p><p>這邊有還不錯的解說</p><p><a href="https://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-processing-an-unsorted-array">java — Why is processing a sorted array faster than processing an unsorted array? — Stack Overflow</a></p><p>願原力與你同在.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b4914f8232cc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[讓pyvis的show()放到函數內依然能在jupyter顯示結果]]></title>
            <link>https://medium.com/@t1neo/%E8%AE%93pyvis%E7%9A%84show-%E6%94%BE%E5%88%B0%E5%87%BD%E6%95%B8%E5%85%A7%E4%BE%9D%E7%84%B6%E8%83%BD%E5%9C%A8jupyter%E9%A1%AF%E7%A4%BA%E7%B5%90%E6%9E%9C-b2b29b2bef1e?source=rss-100996510918------2</link>
            <guid isPermaLink="false">https://medium.com/p/b2b29b2bef1e</guid>
            <category><![CDATA[pyvis]]></category>
            <category><![CDATA[graph-theory]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[jupyter]]></category>
            <category><![CDATA[networkx]]></category>
            <dc:creator><![CDATA[Thomas Anderson]]></dc:creator>
            <pubDate>Mon, 02 May 2022 14:02:56 GMT</pubDate>
            <atom:updated>2022-05-02T14:02:56.355Z</atom:updated>
            <content:encoded><![CDATA[<p>讓pyvis的show()放到函數內依然能在jupyter顯示結果</p><p>在python如果需要使用圖論(graph theory)通常會使用networkx</p><p>如果要畫相關的圖, pyvis這套件或許可以提供不錯的效果.</p><p>譬如可以透過滾輪快速放大縮小.</p><pre># inside jupyter<br>import networkx as nx</pre><pre>from pyvis import network as net<br></pre><pre>nx_graph = nx.complete_graph(8)  # 隨便建一個圖<br>g = net.Network(notebook=True)<br>g.from_nx(nx_graph)<br>g.show(&#39;nx_graph.html&#39;)</pre><p>上面這段會把用networkx建的圖存到nx_graph.html這個檔案內<br>並且在cell下顯示.</p><p>希望每次要顯示圖都可以一行完成, 所以寫了一個函數.</p><pre>def vis_graph(nx_graph, file_name=&#39;nx_grpah.html&#39;):<br>    g = net.Network(notebook=True)<br>    g.from_nx(nx_graph)<br>    g.show(file_name)<br>    return</pre><p>執行</p><pre>vis_graph(nx_graph)</pre><p>會發現沒有出現圖, 但是圖片有存到nx_graph.html</p><p>查一下source code(或用type()看一下)</p><p><a href="https://github.com/WestHealth/pyvis/blob/master/pyvis/network.py#L484">pyvis/network.py at master · WestHealth/pyvis</a></p><p>可以知道g.show()是一個 IPython.lib.display.IFrame</p><p>放到函數內時jupyter cell就無法顯示</p><p>有兩個workaround</p><pre># method 1<br>def vis_graph(nx_graph, file_name=&#39;nx_grpah.html&#39;):<br>    # can import this at the beginning<br>    from IPython.display import display<br>    g = net.Network(notebook=True)<br>    g.from_nx(nx_graph)<br>    display(g.show(file_name))<br>    return</pre><pre># method 2<br>def vis_graph(nx_graph, file_name=&#39;nx_grpah.html&#39;):<br>    g = net.Network(notebook=True)<br>    g.from_nx(nx_graph)<br>    return g.show(file_name)</pre><p>第一個是用IPython內的display函數去顯示IFrame, 同個cell中多次執行就會顯示多個.</p><p>第二個是將IFram當作return, 如果在一個cell中最後執行, cell接到就會顯示出來.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b2b29b2bef1e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[簡介Google hash code]]></title>
            <link>https://medium.com/@t1neo/%E7%B0%A1%E4%BB%8Bgoogle-hash-code-889802ee2ec6?source=rss-100996510918------2</link>
            <guid isPermaLink="false">https://medium.com/p/889802ee2ec6</guid>
            <category><![CDATA[hashcode]]></category>
            <dc:creator><![CDATA[Thomas Anderson]]></dc:creator>
            <pubDate>Wed, 16 Feb 2022 15:42:01 GMT</pubDate>
            <atom:updated>2022-02-17T03:33:56.395Z</atom:updated>
            <content:encoded><![CDATA[<p>hash code是一個團隊演算法競賽, 從2014開始.</p><p>題目是google實際上遇到問題的簡化版</p><p>沒有標準答案, 想個方法讓總分盡量高就好.</p><p>每個題目(一輪應該只有一個題目)會有多個不同的input data.</p><p>總分就是每個input data的結果總和.</p><p>但是每個input data可以用不同的程式碼去跑.</p><p>所以可以針對各種不同的情況用不同的解法, 當然也可以由不同的人上傳.</p><p>2021資格賽是設計一個交通號誌系統.</p><p>2020資格賽是圖書館藏書排序問題.</p><p>github, codeforce, kaggle上都有一些討論這題目的資訊可以看.</p><p>沒有一定要用傳統課本上有提到的演算法. 當然也不需要自己造什麼NN. (要的話應該也可以)</p><p>我只有參加過這兩年的資格賽,</p><p>2021</p><p>看跟隊友的對話紀錄 不確定是5XX or 25XX 隊名都亂取 忘記是哪個…</p><p><a href="https://codingcompetitions.withgoogle.com/hashcode/archive/2021">https://codingcompetitions.withgoogle.com/hashcode/archive/2021</a></p><p>2020</p><p>好像是1856</p><p><a href="https://codingcompetitions.withgoogle.com/hashcode/archive/2020">https://codingcompetitions.withgoogle.com/hashcode/archive/2020</a></p><p>下面是hash code的官方連結. 有提供一個練習題目.</p><p><a href="https://codingcompetitions.withgoogle.com/hashcode/">Hash Code - Google&#39;s Coding Competitions</a></p><p>之前的題目可以看這裡.</p><p><a href="https://codingcompetitions.withgoogle.com/hashcode/archive?utm_medium=email%20&amp;utm_source=toolkit&amp;utm_campaign=reg_promo&amp;src=Online%2FTOPs%2FHC">Hash Code - Google&#39;s Coding Competitions</a></p><p>資格賽比賽時間約三小時. 時間對台灣時區來說比較不利.</p><p>但會有extend round, 持續好幾天的樣子. 題目一樣, 有即時評分系統可以看看自己的成果. 以好玩來說算夠了.</p><p>程式在自己的電腦上跑. 所以基本上也沒有超時問題. 自己可以接受的時間就行了.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=889802ee2ec6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[After 2 years.]]></title>
            <link>https://medium.com/@t1neo/after-2-years-d88fd167b323?source=rss-100996510918------2</link>
            <guid isPermaLink="false">https://medium.com/p/d88fd167b323</guid>
            <dc:creator><![CDATA[Thomas Anderson]]></dc:creator>
            <pubDate>Fri, 17 Dec 2021 15:54:38 GMT</pubDate>
            <atom:updated>2021-12-17T15:54:38.593Z</atom:updated>
            <content:encoded><![CDATA[<p>After 2 years.</p><p>不知不覺已經兩年沒有寫文.</p><p>雖然本來就不是定期生產些什麼.</p><p>但有滿多筆記該做而沒有做, 或著解決的問題可以留下足跡, make world become +.</p><p>在駭客任務繼續之後, 把這些東西補上吧.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d88fd167b323" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ipython/jupyter notebook執行一段程式自動顯示花費時間]]></title>
            <link>https://medium.com/@t1neo/ipython-jupyter-notebook%E5%9F%B7%E8%A1%8C%E4%B8%80%E6%AE%B5%E7%A8%8B%E5%BC%8F%E8%87%AA%E5%8B%95%E9%A1%AF%E7%A4%BA%E8%8A%B1%E8%B2%BB%E6%99%82%E9%96%93-c7edd483f844?source=rss-100996510918------2</link>
            <guid isPermaLink="false">https://medium.com/p/c7edd483f844</guid>
            <category><![CDATA[jupyter-notebook]]></category>
            <category><![CDATA[ipython]]></category>
            <category><![CDATA[autotime]]></category>
            <dc:creator><![CDATA[Thomas Anderson]]></dc:creator>
            <pubDate>Sat, 12 Oct 2019 06:03:34 GMT</pubDate>
            <atom:updated>2019-10-12T06:03:34.846Z</atom:updated>
            <content:encoded><![CDATA[<p>只要用以下指令安裝ipython-autotime即可.</p><pre>$ pip3 install ipython-autotime</pre><p>在ipython/jupyter notebook內輸入</p><pre>In[1]: %load_ext autotime</pre><p>以後每執行一段程式, 就會自動顯示花費的時間.</p><p>但是下次進去就又沒有了, 每次都要重新輸入有點麻煩.</p><pre>$ ipython3 profile create</pre><p>訊息顯示產生兩個檔案(包含路徑), ipython_config.py, ipython_kernel_config.py.</p><p>編輯ipython_config.py, 找到</p><pre>#c.InteractiveShellApp.extensions = []</pre><p>改成</p><pre>c.InteractiveShellApp.extensions = [&#39;autotime&#39;]</pre><p>這樣應該就可以.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c7edd483f844" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[演算法觀點的圖論 2.6聯集尋找問題 python3實作(抄襲)兼解說 - 1]]></title>
            <link>https://medium.com/@t1neo/%E6%BC%94%E7%AE%97%E6%B3%95%E8%A7%80%E9%BB%9E%E7%9A%84%E5%9C%96%E8%AB%96-2-6%E8%81%AF%E9%9B%86%E5%B0%8B%E6%89%BE%E5%95%8F%E9%A1%8C-python3%E5%AF%A6%E4%BD%9C-%E6%8A%84%E8%A5%B2-%E5%85%BC%E8%A7%A3%E8%AA%AA-1-12e7345aa77e?source=rss-100996510918------2</link>
            <guid isPermaLink="false">https://medium.com/p/12e7345aa77e</guid>
            <category><![CDATA[python]]></category>
            <category><![CDATA[graph-theory]]></category>
            <category><![CDATA[演算法觀點的圖論]]></category>
            <category><![CDATA[union-find]]></category>
            <category><![CDATA[disjoint-set]]></category>
            <dc:creator><![CDATA[Thomas Anderson]]></dc:creator>
            <pubDate>Mon, 07 Oct 2019 06:18:04 GMT</pubDate>
            <atom:updated>2019-10-10T00:02:12.072Z</atom:updated>
            <content:encoded><![CDATA[<p>演算法觀點的圖論(GTWAAP) 2.6聯集尋找問題(Union Find / Disjoint Sets) notes and python3實作(抄襲) - 1</p><p>這個演算法的英文名稱叫做Union Find / Disjoint Sets.</p><p>問題描述如下. a, b, c說的都是同一件事情.</p><p>a.一個有限集合U有n個元素, 其元素彼此間可能具有直接關聯性. 兩元素對同一元素有直接關聯性, 則算是具有間接關聯性. 而兩元素對同一元素有間接關聯性, 也算是有間接關聯性. 將U切割成數個非空子集u_i, 同子集內的任意兩元素有關聯性(直接或間接都可), 分屬不同子集間的元素不具有關聯性(直接或間接都沒有).</p><p>b.一個graph G有n個點, 點之間有關聯性就用一個邊連接起來(無向邊), 把G切成數個不連通(走不到)的子圖g_i.</p><p>c.社交小圈圈問題. 我認識校隊隊長, 校隊隊長認識校花, 校花認識大神, 這樣就構成一個小圈圈(但是我不認識校花跟大神沒有關係). 給定n個人, 找出這n個人可以分成幾個小圈圈. 小圈圈內任意兩人可以連連看到對方, 不同小圈圈內的人互相不認識.</p><p>初步的想法</p><p>每個group恰有一個leader, 當一個group只有一個member的時候, leader就是member自己. 兩個group有member具有關聯時就合併(兩個互斥集合取聯集), 新的leader在原本兩個leader中取一個.</p><p>用一個長度n的陣列group去紀錄每個member的leader是誰. 初始設定為每個member都分屬一個獨立的集合, leader就是自己. 兩group合併時, 修改其中之一的leader.</p><p>以下是一個簡短的範例. 合併時使用編號較小的leader當作新leader. 建議用手操作一次這個範例, 觀察每一次的變化.</p><pre>n = 6  # 隨便給的數字<br>group = [i for i in range(n)]  # 每個元素i, 其所屬的group是group[i]<br>connects = [(0, 4), (3, 5), (1, 2), (2, 5), (5, 1)]  # 也是隨便給的數字</pre><pre>for c in connects:<br>    if group[c[0]] == group[c[1]]:  # already in the same group<br>        continue<br>    p = min(c)<br>    q = max(c)<br>    for i in range(len(group)):<br>        if group[i] == group[q]:<br>            group[i] = group[p]</pre><pre># group = [0, 1, 1, 1, 0, 1]</pre><p>為了要確定合併時要修改leader的member有誰, 跑了兩個for loop, time complexity O(n²). 這是由於使用陣列的限制造成的.</p><p>嘗試改進</p><p>把每個leader對應的全部member另外存起來, 這樣查詢一個leader下的member不用再遍尋陣列group. python可以利用dictionary, key為leader, value存所有的member, 使用的data type可以是集合(set)或連結串列(linked list), 各有優缺點, 原則上都比陣列(array, in python is called list)來的好. 單純以查詢跟合併所需的time complexity做比較, 簡列如下.</p><p>set: O(1), O(n)</p><p>linked list: O(n), O(1)</p><p>array: O(n), O(n)</p><p>合併時把被合併的group內member的leader修改為新leader. 然後把group合併.</p><p>更進一步, 由元素較多的group合併元素較少的, 需要操作的次數較少, 且可以避開worst cases.</p><p>在選擇set作為dictionary value的情況下, 實做了一個python3的union find class. 方法跟上面都一樣, 看註解應該可以理解.</p><p><a href="https://github.com/theoneisneo/noteOfGtwaap/blob/master/unionFind.py">theoneisneo/noteOfGtwaap</a></p><p>還有更快的方法(書中有寫, 我在遙遙無期的下一篇也會寫), 不過以上的實作就足夠解決大部分的問題了.</p><p>當然如果要實際解決一些圖論的問題, 我會推薦使用如networkX, cuGraph, igraph, graph-tool這類現成的lib.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=12e7345aa77e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[找出費式數列中的質數/Find Fibonacci primes]]></title>
            <link>https://medium.com/@t1neo/%E6%89%BE%E5%87%BA%E8%B2%BB%E5%BC%8F%E6%95%B8%E5%88%97%E4%B8%AD%E7%9A%84%E8%B3%AA%E6%95%B8-find-fibonacci-primes-165c5d07314d?source=rss-100996510918------2</link>
            <guid isPermaLink="false">https://medium.com/p/165c5d07314d</guid>
            <category><![CDATA[primes]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[fibonacci]]></category>
            <category><![CDATA[algorithms]]></category>
            <dc:creator><![CDATA[Thomas Anderson]]></dc:creator>
            <pubDate>Wed, 08 May 2019 16:11:56 GMT</pubDate>
            <atom:updated>2019-05-08T16:11:56.105Z</atom:updated>
            <content:encoded><![CDATA[<p>The English version would update in the future, if you want to read it , please let me know, I will write it ASAP.</p><p>前幾天被問說是不是在面試人的時候問這題的演算法, 我說:&quot;沒有啊, 這什麼東西. XD&quot;</p><p>於是隨手看了一下, 原則大概是要掌握一個性質</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/391/1*k667UgB_WM1wgNy7Lyz7sA.png" /></figure><p>由此可知, 如果Fib(c)是質數, 那c也是質數, c ≥ 5, Fib(1) = 1, Fib(2) = 1.</p><p>Note:知道這個會快一點, 但對真的要研究這個問題, 可能還遠遠不夠.</p><p>關於此性質的證明如下</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/418/1*VAAIEds8iyaRd_T72P2oNg.png" /></figure><p>演算法大致上是</p><p>檢驗奇數c是否為質數, 如果是就檢驗Fib(c)是否為質數.</p><p>這之中影響效率的有(A)計算Fib(c) (B)質數檢驗</p><p>計算Fib(c)除了常見的DP以外, 可以用二次方遞迴, 如下, 用Fib一般式或著矩陣都可以推出.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/643/1*jOaJ16u4hBMTgLBc8caLyg.png" /></figure><p>質數檢驗要確定解, 基本上是暴力檢查, 不過機率式的檢驗演算法已經很有幫助, 譬如Miller-Robin. 以sympy.ntheory.primetest.isprime(n)來說, n &lt; 2⁶⁴時, 檢驗的結果是必定正確的, 當n &gt; 2⁶⁴時, 如果驗出是質數, 則有很小的機率可能不是, 所以此時再重新用暴力檢查確認, 即可省下很多時間.</p><p>very simple python3 code</p><pre>from sympy.ntheory import isprime</pre><pre>def isPrime(p):<br>    if type(p) is not int or n &lt; 0:<br>        return False<br>    elif p &lt;= 2 ** 64:<br>        return isprime(p)<br>    else:<br>        # left as an exercise or just call some lib, return isprime() from sympy.ntheory is just a lazy doing.<br>        return isprime(p)</pre><pre>def fib(n):<br>    if n &lt; 0:<br>        raise ValueError(&quot;Negative arguments not implemented&quot;)<br>    return _fib(n)[0]<br><br>def _fib(n):<br>    if n == 0:<br>        return (0, 1)<br>    else:<br>        a, b = _fib(n // 2)<br>        c = a * (b * 2 - a)<br>        d = a * a + b * b<br>        if n % 2 == 0:<br>            return (c, d)<br>        else:<br>            return (d, c + d)</pre><pre>def isNthFibPrime(n):<br>    if isPrime(n):</pre><pre>        fibN = fib(n)      <br>        if isPrime(fibN):<br>           return True, fibN<br>        else:<br>           return False, fibN<br>    else:<br>        return False, None</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=165c5d07314d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A possible way to solve valgrind: mmap(*, *) failed in UME with error 12 (Cannot allocate memory)]]></title>
            <link>https://medium.com/@t1neo/a-possible-way-to-solve-valgrind-mmap-failed-in-ume-with-error-12-cannot-allocate-memory-b41b564b23d0?source=rss-100996510918------2</link>
            <guid isPermaLink="false">https://medium.com/p/b41b564b23d0</guid>
            <category><![CDATA[valgrind]]></category>
            <category><![CDATA[google-cloud-platform]]></category>
            <dc:creator><![CDATA[Thomas Anderson]]></dc:creator>
            <pubDate>Mon, 22 Apr 2019 15:34:51 GMT</pubDate>
            <atom:updated>2019-04-22T15:34:51.252Z</atom:updated>
            <content:encoded><![CDATA[<p>I ran a fortran program on Ubuntu 18.04 LTS (WSL), all things are good. But I always got segmentation fault on Ubuntu 18.04 LTS (VM instanse of GCP, Google Cloud Platform).</p><p>I used valgrind to analysis the fortran program, got</p><pre>valgrind: mmap(*, *) failed in UME with error 12 (Cannot allocate memory)</pre><p>And no any other messages.</p><p>Note that I am not sure the values of mmap(*, *) are important or not. I forgot those values.</p><p>I found post discussed this, said it is a bug of linux kernel, and have been fixed in v4.5, but my kernel is v4.20. Update kernel can not solve this for me.</p><p>Finally I found that the root cause is memory size too small (I use the smallest VM on GCP before), after changing to a larger one, all things are good.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b41b564b23d0" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>