[英]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.