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

2021-09-01 13:44:55 字數 1200 閱讀 8871

關於對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

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

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語句功能是一樣的,目的就是人工分配記憶體為棧記憶體。 本文介紹的兩個語句,就可以把記憶體當中空餘的記憶體分配給棧,使一般正常操作的時候不會出現棧溢位的情況。

關於大資料

最近在學習軟考的時候,發現了 大資料 以前只是聽說過大資料,這次在學習軟考的時候我那顆好奇的心把我帶入到了大資料.其實,大資料跟我們的生活息息相關,跟我們的衣食住行,醫療,教育,體育等等.都離不開大資料。大資料 big data 是 無法將現有的軟體工具進行提取,儲存,搜尋,共享,分析和處理海量的,...

關於大資料的大資料平台

大資料平台,顧名思義就是整合 應用和大資料系統之間的差異,將應用程式產生的資料匯入到大資料系統,經過處理計算後再匯出給應用程式使用。網際網路產品處理使用者請求,需要毫秒級的響應,要在 1 秒內完成計算,普通大資料計算必然不能實現這樣的響應要求。如何才能彌補這網際網路和大資料系統之間的差異呢?解決方案...

大資料常用技術棧

提起大資料,不得不提由ibm提出的關於大資料的5v特性 volume 大量 velocity 高速 variety 多樣 value 低價值密度 veracity 真實性 而對於大資料領域的從業人員的日常工作也與這5v密切相關。大資料技術在過去的幾十年中取得非常迅速的發展,尤以hadoop和spar...