簡體   English   中英

優化堆棧大小以評估RPN表達式

[英]Optimizing stack size for evaluating RPN expression

我正在嘗試制作一個程序,該程序將使用OpenCL(並行具有不同的參數值)在GPU上以反波蘭表示法對表達式進行求值。

我有一個AST表達式,我需要將其轉換為RPN,但是由於我的二進制操作是可交換的,因此有多種方法可以實現,並且我需要找到一種在評估期間使用最少堆棧空間的方法。

舉例來說,我可以將1到4與1 2 + 3 + 4 + (在任何時候只需要堆疊2個項目)或1 2 3 4 + + + (需要4個項目)相加。

我可以使用什么算法來做到這一點?

如果您可以依靠的只是可交換性(或者等效地,如果每個運算符都實現為兩個版本,其中一個版本顛倒了其參數),則可以通過遞歸遍歷AST來最大程度地降低堆棧成本,在每個節點上首先訪問代價最高的節點兒童。 要計算節點的成本,需要執行一個簡單的遞歸計算:葉子的成本為一個,非葉子的成本為成本最高的子代的成本(如果子代的成本不同,否則子代的成本大於每個孩子的費用。 (另一個表達式是max(max(left, right), min(left, right)+1) )。 (如果您的節點有兩個以上的子節點,則需要類似但更復雜的公式。)

如果您還可以依賴於關聯性,允許將ab+cd++ (成本3)替換為ab+c+d+ (成本2),則應從最大程度地平衡 AST開始。

如果所有二進制運算都是可交換的,則可以使用樹平衡算法( 此處提供一些示例)。 平衡的樹將具有最小深度。 然后對該平衡樹執行深度優先遍歷,以生成使堆棧大小最小的RPN。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM