關於對ACM OJ大資料遞迴棧溢出問題的解決方案

來源:互聯網
上載者:User

關於對ACM OJ大資料遞迴棧溢出問題的解決方案
Posted by This_poet on
2012-08-15
編輯 
問題來源

我在為參加NOIP的同學出類比題的時候,免不得去BNU、HDU這些我校同學不常去的題庫上面找題來強化或改編。今天我去找了BNU Contest上的一道題,涉及到需要縮環為點。顯然,遞迴tarjan是縮環的最方便選擇。然而,有時候題目當中的資料範圍是N<=100000甚至更大,如果圖是一條鏈的情況,程式用遞迴來實現一定會導致棧溢出。本文就將介紹如何解決這個問題。


解決方案

對於記憶體限制,除了SGU的OJ,各個題庫所給出的限制一般是很寬鬆的(卡記憶體題目除外),最小也有32MB(32768KB)。然而,大部分評測機的棧空間限制只有2MB,稍微差一點的可能會是1MB甚至更小。因此,我們可以考慮把那些剩餘的記憶體配置給棧空間,從而解決這種棧溢出的問題。對於pascal語言,$M文法可以解決這個問題,我們只需要在程式前面加上一句:


view
source 
print?

1 {$M 100000000}


這樣就可以解決一般的棧溢出問題了。簡單一看是一備註陳述式,可不要小看了“$”,這個符號讓整個語句變成了一句命令。當然,如果你的程式陷入了無限遞迴當中,使用這個語句是沒有辦法自動解決的。這個語句是用來解決想要遞迴(有終止)地解決問題,資料較大,需要佔用的占空間較大,然而又苦於棧記憶體配置得不夠大的問題。其本質就是人工分配一下棧的記憶體大小。

pascal語言當中,問題圓滿解決了。然而對於廣大C++語言選手來說,問題還是沒有解決,那麼,C++語言當 中,有沒有類似的文法呢?

答案是有的!

對於C++語言,我們可以在程式前面加上這樣一句命令:


view
source 
print?

1 #pragma comment(linker, "/STACK:1024000000,1024000000")


這個語句到底是什麼意思呢?援引一段百度百科上的解釋:

#pragma comment( comment-type ,["commentstring"] )

comment-type是一個預定義的標識符,指定注釋的類型,應該是compiler,exestr,lib,linker之一。

commentstring是一個提供為comment-type提供附加資訊的字串。

其實,這個命令和上面介紹的pascal語言當中的$M語句功能是一樣的,目的就是人工分配記憶體為棧記憶體。 本文介紹的兩個語句,就可以把記憶體當中空餘的記憶體配置給棧,使一般正常操作的時候不會出現棧溢出的情況。

相關關鍵詞:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.