數學之美?編程之美?數學 + 編程= unbelievable 美!

歡迎大家前往騰訊雲社區,獲取更多騰訊海量技術實踐乾貨哦~

作者:Rusu

導語

相信大家跟我一樣,偶爾會疑惑:曾經年少的時候學習過的那麼多的複雜的數學函數,牛逼的化學方程式,各種物理原理、公式,到底有什麼用?但事實是,我們所學習過的東西,雖然很多不能夠準確地記得全部,但已經潛移默化地影響到我們的思維模式,很多時候給我們解決一些工作、甚至是生活中的問題,提供了建模的方案,比如,在實現某個需求的時候需要做動畫衰減,可能就能夠通過勻減速運動公式去實現,再比如,本文所要介紹這個案例,整個實現過程其實並沒有多麼難多麼複雜,但從實際問題到模型建立的思維推導過程,筆者認為還是很有意思也很有意義的,所以,也希望能夠分享給大家。

一、 背景問題

有個需求是要將每日消費數據以柱狀圖形式呈現,我們有追求的設計師希望柱子高度在超過某個限額(設為valueNormal)時不再正比增長,而是越來越緩慢地增長,目的是使柱子高度不會出現有些特別高,有些特別矮的情況,那麼,要怎麼才能夠實現這個需求呢?下面將介紹對於這個問題的思路梳理及實現過程。

二、 思路梳理

1. 模型建立:

首先,回到最初目標:使柱子在超過valueNormal之後,高度增長速度越來越慢。也就是說,在消費金額小於等於valueNormal時,柱子高度成正比增長;大於valueNormal時,大於valueNormal的部分,所佔高度隨著值的增加增長速度越來越慢。其次,整個柱狀圖的高度是一定的(設為heightMax),毋庸置疑,最大的消費金額值(設為valueMax)的柱子高度就是heightMax。然後我們對於valueNormal值的柱子的高度設定為heightNormal。這樣,這個問題最終就轉換成這樣的模型:

其中rat就是超過valueNormal的部分的高度在heightMax – heightNormal中所佔的比例,要求(1)rat值隨消費金額值的增加而增加;(2)增加速度逐漸趨緩;(3)rat值的變化區間是0~1;

那麼,根據這個模型,我們需要確定的有以下三個值:(1)valueNormal值如何取;(2)heightNormal值如何取;(3)rat值的計算方法如何確定。這裡valueNormal和heightNormal值可能需要根據業務不同要求等來具體確定,並且在整個程序的生命周期內,不會發生變化,我們下面主要討論rat值的計算方法。

2. rat值的函數設計:

根據1中的模型對rat值的要求,最先想到了漸進函數,最簡單的漸進函數y = 1/x, 函數圖如下:

在x>0時,y值隨x值增加而越來越小,並且減小速度逐漸趨緩,最後無限趨近於0

y = -1/x:

在x>0時,y值隨x增加而越來越大,並且增長速度逐漸趨緩,最後無限趨近於0。這個函數變化趨勢已經跟我們所要的效果很像了,區別在於:我們要求從0開始逐漸趨近於1,繼續改造:

y = 1 – 1/x:

y = 1 – 1/(x+1):

當x>0時,y從0開始逐漸增加,並且增長速度逐漸趨緩,最終趨近於1,這就是我們要的效果了。

3. 應用於實際場景:

2中所得函數式運用於1中模型,x就是value-valueNormal,y就是rat,那麼,也就是說當value-valueNormal=1是,rat = 1/2; value-valueNormal=2時,rat = 2/3。那麼在實際該消費數據的場景下,相當於高於valueNormal值1塊的消費金額就佔了heightMax-heightNormal部分的一半高度,之後隨著value值繼續增加,其高度的增加範圍只是heightMax-heightNormal部分的一半,顯然是不合理的,因此這裡函數式要進一步加參數調整,調整為:y = 1- 1/(x/a + 1) = x/(x+a),這樣,當value-valueNormal = a時,value的高度就是heightNormal + (heightMax-heightNormal)*1/2。

到這裡1中模型就變為:

接著,就剩下確定valueNormal, heightNormal, a的取值如何確定的問題了,通過實驗,最終選用了valueNormal是某個月份的消費日均值(設為Average),heightNormal是整個柱狀圖高度的1/2,a是Average的一半。這樣,這個模型就具體化為:

化解為:

將一個實際例子套用到該模型中,9月份總消費金額是121669元,該月日均消費金額是4055.63元,假定HeightMax = 5000,整體函數示意圖如下所示:

可以看出這是完全符合我們最初設計要求的:在消費金額小於等於日均消費金額值時,柱子高度隨金額值增加成正比增長;之後,隨著消費金額值的增加,柱子高度仍然不斷增長,但增高幅度越來越緩慢,最終無限趨近於柱狀圖總高度。

三、 實現效果:

最終實現效果如下:

完美!

相關閱讀

一站式滿足電商節雲計算需求的秘訣

騰訊爆款遊戲收割機的背後,MTA 4 年內覆蓋 150 萬 APP

Bloom Filter 的基本原理和實現

此文已由作者授權騰訊雲技術社區發布,轉載請註明文章出處

原文鏈接:cloud.tencent.com/commucloud.tencent.com/commu

海量技術實踐經驗,盡在騰訊雲社區!

海量技術實踐經驗,盡在騰訊雲社區! cloud.tencent.com/commu


推薦閱讀:

Mirror descent: 統一框架下的first order methods
有趣的演算法(一):如何讓有情人終成眷屬
你遇到過哪些概率極小的事情?
Serre《算術教程》筆記(1)
範疇論學習筆記11:範疇的範疇

TAG:編程 | 模型 | 數學 |