筆試題目記錄

    筆試的感受不是很好,部分題目不太會,這裏簡單記錄一下不了解的題目。html

    一、同一進程中的不一樣線程共享哪些資源?算法

    二、蒲豐投針的問題,與機率比較相關的問題。多線程

         題目描述:平面上畫不少平行線,間距爲a, 向此平面內投擲長度爲l(l<a) 的針,求此針與任一直線相交的機率?併發

    三、給出一系列的1*h的矩形,求矩形的最大面積。函數

        如圖:spa

       

     筆試中這三個題目比較不知因此,操做系統的內容已經忘記了,因此第一個題目不太瞭解。第二個題目也很生疏,數學功底很是的弱。第三個題目想了一個奇葩的思路,當時就想應該會有O(n)的解法,可是當時怎麼想都沒有想到提升時間效率的方法,因此最後仍是寫了那個奇葩的思路。操作系統

1. 這個問題的答案參考兩個地方,不太肯定是否準確。.net

    多線程中每一個線程獨立的地方:    (http://laiyuanyuan7.blog.163.com/blog/static/15274321201241191321666/線程

    1.線程ID
      每一個線程都有本身的線程ID,這個ID在本進程中是惟一的。進程用此來標
識線程。
 
    2.寄存器組的值
       因爲線程間是併發運行的,每一個線程有本身不一樣的運行線索,當從一個線
程切換到另外一個線程上時,必須將原有的線程的寄存器集合的狀態保存,以便未來該線程在被從新切換到時能得以恢復。
 
    3.線程的堆棧(這裏的堆棧應該是棧的意思)
       堆棧是保證線程獨立運行所必須的。
       線程函數能夠調用函數,而被調用函數中又是能夠層層嵌套的,因此線程
必須擁有本身的函數堆棧,使得函數調用能夠正常執行,不受其餘線程的影響。

    4.錯誤返回碼
       因爲同一個進程中有不少個線程在同時運行,可能某個線程進行系統調用
後設置了errno值,而在該線程尚未處理這個錯誤,另一個線程就在此時被調度器投入運行,這樣錯誤值就有可能被修改。因此,不一樣的線程應該擁有本身的錯誤返回碼變量。

    5.線程的信號屏蔽碼
       因爲每一個線程所感興趣的信號不一樣,因此線程的信號屏蔽碼應該由線程自
己管理。但全部的線程都共享一樣的信號處理器。

    6.線程的優先級
       因爲線程須要像進程那樣可以被調度,那麼就必需要有可供調度使用的參
數,這個參數就是線程的優先級。
   
    這裏另一個網友的說法,比較明確,信息應該比較準確。( http://blog.sina.com.cn/s/blog_4b9eab320100n2et.html
    
    共享的資源有
    a. 堆  因爲堆是在進程空間中開闢出來的,因此它是理所固然地被共享的;所以new出來的都是共享的(16位平臺上分全局堆和局部堆,局部堆是獨享的)
    b. 全局變量 它是與具體某一函數無關的,因此也與特定線程無關;所以也是共享的
    c. 靜態變量 雖然對於局部變量來講,它在代碼中是「放」在某一函數中的,可是其存放位置和全局變量同樣,存於堆中開闢的.bss和.data段,是共享的
    d. 文件等公用資源  這個是共享的,使用這些公共資源的線程必須同步。Win32 提供了幾種同步資源的方式,包括信號、臨界區、事件和互斥體。
    獨享的資源有
    a. 棧 棧是獨享的
    b. 寄存器  這個可能會誤解,由於電腦的寄存器是物理的,每一個線程去取值難道不同嗎?其實線程裏存放的是副本,包括程序計數器PC

2.    18世紀,法國數學家布豐和勒可萊爾提出的「投針問題」,記載於布豐1777年出版的著做中:「在平面上畫有一組間距爲a的平行線,將一根長度爲l(l<a)的針任意擲在這個平面上,求此針與平行線中任一條相交的機率。」布豐本人證實了,這個機率是p=2l/(πd) π爲圓周率。htm

       證實:(from 百度百科)下面就是一個簡單而巧妙的證實。找一根鐵絲彎成一個圓圈,使其直徑偏偏等於平行線間的距離d。能夠想象獲得,對於這樣的圓圈來講,無論怎麼扔下,都將和平行線有兩個交點。所以,若是圓圈扔下的次數爲n次,那麼相交的交點總數必爲2n。如今設想把圓圈拉直,變成一條長爲πd的鐵絲。顯然,這樣的鐵絲扔下時與平行線相交的情形要比圓圈複雜些,可能有4個交點,3個交點,2個交點,1個交點,甚至於都不相交。因爲圓圈和直線的長度同爲πd,根據機會均等的原理,當它們投擲次數較多,且相等時,二者與平行線組交點的總數指望也是同樣的。這就是說,當長爲πd的鐵絲扔下n次時,與平行線相交的交點總數應大體爲2n。如今轉而討論鐵絲長爲l的情形。當投擲次數n增大的時候,這種鐵絲跟平行線相交的交點總數m應當與長度l成正比,於是有:m=kl,式中k是比例係數。爲了求出k來,只需注意到,對於l=πd的特殊情形,有m=2n。因而求得k=(2n)/(πd)。代入前式就有:m≈(2ln)/(πd)從而π≈(2ln)/(dm)

 

3.(1)當時解題的思路比較詭異,一直想着要縮小問題的規模,而後得出的思路是:首先找出最短的一個矩形,而後這個最短的矩形高度*長度得出一個面積,而後利用最矮的矩形將原來的問題切割成爲左邊的一個子問題和右邊的一個子問題。

這個解題思路若是是矩形排列比較好的狀況下可以達到O(nlgn)的時間複雜度。可是後來想一想,若是若是連續的矩形單調遞減或者單調遞增,這個算法的複雜度就會退化爲O(n2),因此這個算法思路不是很好。

   (2)這裏說一下窮舉的思路其實時間複雜度也僅僅只有O(n2)而已。思路就是窮舉每個矩形條能夠擴展的最大矩形面積。向左向右延伸,延伸結束的條件是出現高度小於其的矩形條,這樣能夠獲得一個寬度,而後計算每一個矩形條能夠延伸的最大面積,最後得出最大的面積。

   (3)改進的思路也是基於窮舉的思路進行改進的,窮舉的時候由於有重複的計算,因此這裏就存在的改進空間。搜索了一下網上提供的思路,都是單調堆棧的思路,應該就是這個改進方法了。(from http://blog.csdn.net/alongela/article/details/8230739

創建一個單調遞增棧,全部元素各進棧和出棧一次便可。每一個元素出棧的時候更新最大的矩形面積。

設棧內的元素爲一個二元組(x, y),x表示矩形的高度,y表示矩形的寬度。

若原始矩形高度分別爲2,1,4,5,1,3,3

高度爲2的元素進棧,當前棧爲(2,1)

高度爲1的元素準備進棧,但必須從棧頂開始刪除高度大於或等於1的矩形,由於2已經不可能延續到當前矩形。刪除(2,1)這個元素以後,更新最大矩形面積爲2*1=2,而後把它的寬度1累加到當前高度爲1的準備進棧的矩形,而後進棧,當前棧爲(1,2)

高度爲4的元素進棧,當前棧爲(1,2) (4,1)

高度爲5的元素進棧,當前棧爲(1,2) (4,1) (5,1)

高度爲1的元素準備進棧,刪除(5,1)這個元素,更新最大矩形面積爲5*1=5,把1累加到下一個元素,獲得(4,2),刪除(4,2),更新最大矩形面積爲4*2=8,把2累加到下一個元素,獲得(1,4),1*4=4<8,沒必要更新,刪除(1,4),把4累加到當前準備進棧的元素而後進棧,當前棧爲(1,5)

高度爲3的元素進棧,當前棧爲(1,5) (3,1)

高度爲3的元素準備進棧,刪除(3,1),沒必要更新,把1累加到當前準備進棧的元素而後進棧,當前棧爲(1,5) (3,2)

把餘下的元素逐個出棧,(3,2)出棧,沒必要更新,把2累加到下一個元素,當前棧爲(1,7),(1,7)出棧,沒必要更新。棧空,結束。

最後的答案就是8。

相關文章
相關標籤/搜索