日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于大数据的那些事儿

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于大数据的那些事儿 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳說中大數據處理的那些事曾是那樣的困擾我們。

往往是我們的面試殺手。

其實面對大數據的運算就是劃分,根據庖丁解牛的原理:

方法有很多。但是最常用的是用數組和鏈表存儲每一位數據。這兩種方法各有優略。

下面給大家講述一種:數組的實現:

大數據用一個int類型的數組存放,為了處理方便(其實char數組也可以),數組最高位存放大數據的長度

加法:

int bigplus(int a[],int b[],int c[]) //大整數加法 {int i,len;len=(a[0]>b[0]?a[0]:b[0]); //a[0] b[0]保存數組長度,len為較長的一個 for(i=0;i<MAXINT;i++) //將數組清0 c[i]=0;for (i=1;i<=len;i++) //計算每一位的值 {c[i]+=(a[i]+b[i]);if (c[i]>=10){c[i]-=10; //大于10的取個位 c[i+1]++; //高位加1 }}if (c[i+1]>0) len++;c[0]=len; //c[0]保存結果數組實際長度 printf("Big integers add: "); for (i=len;i>=1;i--)printf("%d",c[i]); //打印結果 printf("\n");return 0; }

代碼很清楚,不需要過多解釋,注釋也很詳細,主要是分開處理
另外:對于結果高位處理的地方和下面乘除不一樣。因為兩個數相加,最高位最多只進位一位,所以,沒有while循環處理,只有if語句判斷處理即可

?

和加法相似的就是乘法,先看代碼:

乘法1:一個大數據和一個范圍內的數據相乘

int bigmult(int a[],unsigned int b,int c[])//高精度乘以低精度 {int len,i;for (i=0;i<MAXINT;i++) //數組清0 c[i]=0;len=a[0];for(i=1;i<=len;i++) //對每一位計算 {c[i]+=a[i]*b;c[i+1]+=c[i]/10;c[i]%=10;}while (c[++len]>=10) //處理高位 {c[len+1]=c[len]/10;c[len]%=10;}if (c[len]==0) len--; //處理高進位為0情況printf("Big integrs multi small integer: "); for (i=len;i>=1;i--)printf("%d",c[i]);printf("\n"); return 0; }

乘法2:兩個大數據相乘:

int bigmult2(int a[],int b[],int c[]) //高精度乘以高精度 {int i,j,len;for (i=0;i<MAXINT;i++) //數組清0 c[i]=0;for (i=1;i<=a[0];i++) //被乘數循環 for (j=1;j<=b[0];j++) //乘數循環 {c[i+j-1]+=a[i]*b[j]; //將每一位計算累加 c[i+j]+=c[i+j-1]/10; //將每一次結果累加到高一位 c[i+j-1]%=10; //計算每一次的個位 }len=a[0]+b[0]; //取最大長度 while (len>1 && c[len]==0) //去掉高位0 len--;c[0]=len;printf("Big integers multi: ");for (i=len;i>=1;i--) //打印結果 printf("%d",c[i]);printf("\n"); return 0; }

其實對于乘法來說,就是相對復雜一點的加法。兩個實現原理是一樣的
最后的高位處理是因為,兩個數據相乘時并不確定結果多少位,只能盡可能多的給空間,然后再處理高位,算出最終真正有效的程度

?

在處理減法和除法的時候要用到比較,因此先給出比較函數:

int compare(int a[],int b[]) //比較大整數的大小 {int i;if (a[0]>b[0]) return 1; //比較a,b的位數確定返回值 else if(a[0]<b[0]) return -1;else //位數相等時的比較 {i=a[0];while (a[i]==b[i]) //逐位比較 i--;if (i==0) return 0;else if(a[i]>b[i]) return 1;else return -1;} }

?

然后我們看減法的實現:

減法:

int bigsub(int a[],int b[],int c[]) //大整數減法 {int i,len;len=(a[0]>b[0]?a[0]:b[0]); //a[0]保存數字長度,len為較長的一個 for(i=0;i<MAXINT;i++) //將數組清0 c[i]=0;if (compare(a,b)==0) //比較a,b大小 {printf("Result:0");return 0; }else if(compare(a,b)>0){for (i=1;i<=len;i++) //計算每一位的值 {c[i]+=(a[i]-b[i]); if (c[i]<0){c[i]+=10; //小于0的原位加10 c[i+1]--; //高位減1 }}}else{for (i=1;i<=len;i++) //計算每一位的值 {c[i]+=(b[i]-a[i]); if (c[i]<0){c[i]+=10; //小于0原位加10 c[i+1]--; //高位減1 }}}while (len>1 && c[len]==0) //去掉高位的0 len--;c[0]=len;printf("Big integers sub= ");if (a[0]<b[0]) printf("-");for(i=len;i>=1;i--) //打印結果 printf("%d",c[i]);printf("\n");return 0; }

?

加法,分情況處理,其實代碼可以簡化,但是這樣便于理解

?

除法1:大數據除以一個范圍內的數據

int bigdiv(int a[],unsigned int b,int c[],int *d) //高精度除以低精度 { //a[] 為被乘數,b為除數,c[]為結果,d為余數 int i,len; len=a[0]; //len為a[0]的數組長度 for (i=len;i>=1;i--){(*d)=10*(*d)+a[i]; //計算每一步余數 c[i]=(*d)/b; //計算每一步結果 (*d)=(*d)%b; //求模余數 } while (len>1 && c[len]==0) //去高位0len--; printf("Big integer div small integer: "); for (i=len;i>=1;i--) //打印結果 printf("%d",c[i]);printf("\tArithmetic compliment:%d",*d); printf("\n"); return 0; }


?

除法2: 大數據處以大數據

int bigdiv2(int a[],int b[],int c[],int d[]) //高精度除以高精度 {int i,j,len;if (compare(a,b)<0) //被除數較小直接打印結果 {printf("Result:0");printf("Arithmetic compliment:");for (i=a[0];i>=1;i--) printf("%d",a[i]);printf("\n");return -1; }for (i=0;i<MAXINT;i++) //商和余數清0 {c[i]=0;d[i]=0;}len=a[0];d[0]=0;for (i=len;i>=1;i--) //逐位相除 {for (j=d[0];j>=1;j--)d[j+1]=d[j];d[1]=a[i]; //高位*10+各位 d[0]++; //數組d長度增1 while (compare(d,b)>=0) //比較d,b大小 {for (j=1;j<=d[0];j++) //做減法d-b {d[j]-=b[j];if (d[j]<0){d[j]+=10;d[j+1]--;}}while (j>0 && d[j]==0) //去掉高位0 j--;d[0]=j;c[i]++; //商所在位值加1 }}j=b[0];while (c[j]==0 && j>0) j--; //求商數組c長度 c[0]=j;printf("Big integers div result: "); for (i=c[0];i>=1;i--) //打印商 printf("%d",c[i]);printf("\tArithmetic compliment: "); //打印余數 for (i=d[0];i>=1;i--)printf("%d",d[i]);printf("\n");return 0; }


除法的原理就是從高位到地位,利用余數作為過渡,一位一位的除,不夠的補0,然后繼續向地位平移。

下面的是上面的復雜版,原理是一樣的。其實看代碼理解起來并不難

?

?

?

總結

以上是生活随笔為你收集整理的关于大数据的那些事儿的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。