RAM的一个实例,向下取整
實現的一個具體算法實例
這個算法的功能是
在向下取整的意義上的除法
具體來說 對于任何一個非負整數c
和正整數d 我們都需要在做完除法之后
再實施向下取整 得到一個整數
那么這個輸出
實際上也就是不超過c/d的那個最大整數
我們可以將它表述為
在所有那些與d相乘以后
不大于c的整數x中的最大值
也可以等效的表述為
在所有乘以d以后嚴格的小于c+1的
那些整數x中的最大值
這樣一種重新的表述
其實不光是文字上的一個轉換
更重要的是
它為我們提供了一個對應的算法思路
我們可以將它表述并且實現如下
具體來講 我們需要保留c+1
并且以它為基礎 反復的從中去減除d
因為RAM模型只支持加或者減運算
不斷的減除
直到對應的那個寄存器R[0]發生下溢
也就是說 它不再是一個正數
這個時候 我們統計下
在此之前所做過減法運算次數
那么它就是我們所要得到的輸出
我們可以將整個這個思路兌現如下
因為這里所有的加法運算和減法運算
都不允許直接對常數進行
而我們一上來就需要做個預處理
對c+1 所有需要利用常數賦值語句
將這個增量1預先的存到一個寄存器
比如R[3]中去
所有接下來我們對R[0]
也就是最初輸入的c
加R[3]之后 實際上效果就是c自增
所以在經過這樣的預處理之后
c+1確實被存放到R[0]中去了
那么接下來 從第二句開始
如果注意到這里有個goto第2個語句的話
我們就知道這實際上是構成了一個循環
那么這個循環是做什么事呢
正如我們前面所說的那樣
它是不斷的需要從剛才那個量里頭去
刨除掉d
d本身也是作為輸入的一部分
已經事先存放在1號寄存器中了
所以每次做的事情
就是從剛才經過預處理以后
存放的實際上是c+1的
那個寄存器R[0]中減除掉d
不斷的減除 每減除一次
我們剛才說過
要相應的把計數器累計
這個計數器在哪呢
在我們這里取做的就是R[2]
第2個寄存器 它的初值是0
所以每一次它都要自加
加一個1 而加的這個1
依然是通過我們預先賦值
那個常數存到R[3]中去來實現
經過了這樣一次自減
經過了一次計數器的累加之后
我們這個時候就要判斷 R[0]
也就是c+1初始的那個數
是否已經不再是一個正數了
如果它還是正數
那就說明還沒有減除完
這個時候我們可以通過goto語句
像剛才所說的繼續執行這一步
所以反過來說
如果我們有朝一日執行到了第5條語句
那就說明R[0]經過若干次減除以后
已經不再是一個正數
而這個時候呢
我們大致就可以返回這個x
當然 通過精細的分析我們會發現
實際上這個數值是差一的
所以這里頭我們還要將R[3]
也就是原來存放的這個常數1
再減一次
經過了這樣一次減法以后
再把這個數值返回回去
才會得到真正準確的
我們所需要的那個向下取整的除法值
那么我們把這樣的一個
具體實例也羅列出來了
具體來說就是
對于c=12以及d=5來做的一個除法
不難發現 如果不取整的話是2.4
所以向下取整的話 應該得到的是2
不出意外 在我們對照代碼
逐行逐條的將整個寄存器序列的內容
作一羅列之后
我們會發現 最終在R[0]這個位置上
會得到并且返回我們
所需要的那個值 也就是2
那么這個算法的正確性
以及更多的例子的給出
留給同學們在課后完成
而我們這里需要向大家
傳達的一個重要的概念
是這張表所暗示的
也就是說 我們不光可以把整個計算過程
逐次羅列出來
更重要的是 正像剛才所說的那樣
我們將整個計算過程所需要的計算成本
轉化為了這個表的規模 或者說它的高度
具體來說就是它的行數
其實就是執行的基本操作的次數
按照我們剛才的推斷
實際上就是我們這個算法
所需時間的一個最客觀的度量
而這個度量是清晰的 明確的
可比較的 而且沒有歧義的
概括一下
我們通過圖靈機模型和RAM模型
給大家一個清晰的尺度
這個尺度確實可以用來對算法進行度量
我們可以此判斷 哪個算法的性能更好
至少在什么情況下更好
當然 也像我們開篇的時候所說的那樣
這只是一把尺子
我們這節只告訴你尺子是什么
那么更重要的一個問題就是
尺子怎么用 如何用好這把尺子
有什么樣的一些規則 有哪些技巧
那么我們要留待后續課節再向大家作介紹
總結
以上是生活随笔為你收集整理的RAM的一个实例,向下取整的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CNN训练注意事项与框架使用
- 下一篇: 自学之路