大資料類
對於大數運算向來都是比較困難的,尤其是現在主流的大質數分解加密法更是難以破解(過於耗費時間),本例將帶你走進大數運算的世界,自帶普通的質數檢測,方便好用。
自定義的大數運算類,根據string字串構造,運算速率較快,過載多種操作符便於使用。
下面是標頭檔案(CLong_Date.h):
//
// CLong_Date.h
// CLong_Date
//
// Created by yaoshun on 13-7-23.
// Copyright (c) 2013年 yaoshun. All rights reserved.
//
/*
版本號:v2.1
作者:ys
日期:2013/8/4
*/
#ifndef __CLong_Date__CLong_Date__
#define __CLong_Date__CLong_Date__
#include <iostream>
#include <vector>
#include <string>
class CLong_Date {
public:
CLong_Date(std::string);
~CLong_Date();
friend std::ostream & operator<<(std::ostream &,
const CLong_Date &);
friend bool operator<(CLong_Date &pro, CLong_Date &behind);
friend bool operator>(CLong_Date &pro, CLong_Date &behind);
friend bool operator==(CLong_Date &pro, CLong_Date &behind);
friend bool operator!=(CLong_Date &pro, CLong_Date &behind);
friend bool operator<=(CLong_Date &pro, CLong_Date &behind);
friend bool operator>=(CLong_Date &pro, CLong_Date &behind);
CLong_Date operator*(const CLong_Date &);
CLong_Date operator/(const CLong_Date &);
CLong_Date operator+(const CLong_Date &);
CLong_Date operator-(const CLong_Date &);
CLong_Date operator%(const CLong_Date &);
CLong_Date operator++(); //後置操作
CLong_Date operator--();
const CLong_Date operator++(int); //前置操作,返回值不能做左值
const CLong_Date operator--(int);
CLong_Date operator+=(const CLong_Date &);
CLong_Date operator-=(const CLong_Date &);
int CheckSign(); //檢查是否為正數
unsigned long GetSize(); //獲得大小
void Connect(const CLong_Date &); //連結兩個CLong_Date
CLong_Date GetSonHead(unsigned long len); //獲得子鏈,從頭數
CLong_Date GetSonTail(unsigned long len); //獲得子鏈,從尾部數
CLong_Date GetSon(unsigned long head,unsigned long tail);
CLong_Date GetRemainder(); //獲得餘數,預設為0
bool CheckPrimeNumber(); //檢查是不是質數
CLong_Date Sqrt(); //用二分法算平方根
CLong_Date Abs(); //取絕對值
protected:
CLong_Date(std::vector<int>); //內建建構函式
private:
//大資料錯位相加
std::vector<int> Max_Aid_Max(std::vector<
std::vector<int> > &result);
//大資料拆分成錯位相加,最後一位表示是否校驗
std::vector<int> Max_Max_vector(std::vector<int> &A,
std::vector<int> &B,
bool check);
//去除頭元素0,全部清空!
std::vector<int> CutZero(std::vector<int> vet);
std::vector<int> m_date; //整數
std::vector<int> m_remainder; //餘數
};
#endif /* defined(__CLong_Date__CLong_Date__) */
下面是原始檔(CLong_Date.cpp):
//
// CLong_Date.cpp
// CLong_Date
//
// Created by yaoshun on 13-7-23.
// Copyright (c) 2013年 yaoshun. All rights reserved.
//
/*
版本號:v2.1
作者:ys
日期:2013/8/4
*/
#include "CLong_Date.h"
#include <stdlib.h>
//public
CLong_Date::CLong_Date(std::string str)
{
unsigned long i=0;
if(str.substr(i,1)=="-")
{
i++;
//去除前置元素0,且全為0時得保留最後一位
while (atoi(str.substr(i,1).c_str())==0 && i<str.length()-1 )
{
i++;
}
m_date.push_back(
(atoi(str.substr(i,1).c_str()))
*(-1));
i++;
}
//去除前置元素0
else
while (atoi(str.substr(i,1).c_str())==0 && i<str.length()-1)
{
i++;
}
for (; i<str.length() ; i++)
{
std::string str_temp=str.substr(i,1);
m_date.push_back(atoi(str_temp.c_str()));
}
if (m_date.size()==0)
throw "It's not a number!";
m_remainder.push_back(0);
}
CLong_Date::~CLong_Date()
{
m_date.clear();
}
std::ostream & operator<<(std::ostream &output,const CLong_Date &other)
{
CLong_Date temp=other;
std::vector<int>::iterator iter;
for(iter=temp.m_date.begin();iter!=temp.m_date.end();iter++)
output<<*iter;
return output;
}
bool operator<(CLong_Date &pro, CLong_Date &behind)
{
CLong_Date temp=pro-behind;
if(temp.CheckSign()>=0)
return false;
else
return true;
}
bool operator>(CLong_Date &pro, CLong_Date &behind)
{
CLong_Date temp=pro-behind;
if(temp.CheckSign()<=0)
return false;
else
return true;
}
bool operator==(CLong_Date &pro, CLong_Date &behind)
{
CLong_Date temp=pro-behind;
if(temp.CheckSign()==0)
return true;
else
return false;
}
bool operator!=(CLong_Date &pro, CLong_Date &behind)
{
if (pro==behind)
return false;
else
return true;
}
bool operator<=(CLong_Date &pro, CLong_Date &behind)
{
if (pro>behind)
return false;
else
return true;
}
bool operator>=(CLong_Date &pro, CLong_Date &behind)
{
if (pro<behind)
return false;
else
return true;
}
CLong_Date CLong_Date::operator*(const CLong_Date &other)
{
std::vector<int> temp_other=other.m_date;
std::vector<int> temp_self=m_date;
bool flag=true;
//同時為負
if (temp_other[0]<0 && temp_self[0]<0)
{
temp_other[0]=temp_other[0]*(-1);
temp_self[0]=temp_self[0]*(-1);
}
//後負前正
if (temp_other[0]<0 && temp_self[0]>0)
{
temp_other[0]=temp_other[0]*(-1);
flag=false;
}
//前負後正
if (temp_self[0]<0 && temp_other[0]>0)
{
temp_self[0]=temp_self[0]*(-1);
flag=false;
}
std::vector<int> result_temp=Max_Max_vector(temp_self,temp_other,false);
std::vector<int>::iterator iter;
std::vector<int> result_temp2;
//去除前面的0
unsigned long count_zero=0;
iter=result_temp.end()-1;
while (*iter==0 && iter>result_temp.begin()) {
iter--;
count_zero++;
}
//記得要倒序
for (iter=result_temp.end()-1-count_zero; iter>=result_temp.begin(); iter--)
{
result_temp2.push_back(*iter);
}
//標誌位
if (!flag)
result_temp2[0]=result_temp2[0]*(-1);
CLong_Date result(result_temp2);
return result;
}
CLong_Date CLong_Date::operator/(const CLong_Date &other)
{
if (m_date[0]==0)
{
CLong_Date result("0");
return result;
}
std::vector<int> temp_other=other.m_date;
std::vector<int> temp_self=m_date;
bool flag=true;
//同時為負
if (temp_other[0]<0 && temp_self[0]<0)
{
temp_other[0]=temp_other[0]*(-1);
temp_self[0]=temp_self[0]*(-1);
}
//後負前正
if (temp_other[0]<0 && temp_self[0]>0)
{
temp_other[0]=temp_other[0]*(-1);
flag=false;
}
//前負後正
if (temp_self[0]<0 && temp_other[0]>0)
{
temp_self[0]=temp_self[0]*(-1);
flag=false;
}
CLong_Date otherS(temp_other);
if (*this<otherS)
throw "Can't div!";
std::vector<int> result_temp; //儲存商
std::vector<int> remainder; //儲存餘數
for (unsigned long i=otherS.GetSize(); i<=temp_self.size(); i++)
{
CLong_Date temp_divider(temp_self);
CLong_Date temp_head=temp_divider.GetSonHead(i);
CLong_Date temp_tail=temp_divider.GetSonTail(temp_self.size()-i);
if (temp_head<otherS) //這裡判斷的話,可以加快速度
{
result_temp.push_back(0);
continue;
}
else
{
int j=1;
std::vector<int> v;
//從2開始測試商
for (j=2; j<=10; j++)
{
v.clear();
v.push_back(j);
CLong_Date Lv(v);
CLong_Date judge=Lv*otherS;
if ( judge > temp_head )
{
v.clear();
v.push_back(j-1);
//儲存商
result_temp.push_back(j-1);
break;
}
}
CLong_Date Lv(v);
CLong_Date up=temp_head-Lv*otherS;
//i要在此儲存數位
i=CutZero(up.m_date).size();
//連線沒除完的餘數
if(temp_tail.m_date.size()==0)
{
remainder=up.m_date;
break;
}
up.Connect(temp_tail);
//初始化
temp_self=CutZero(up.m_date);
//去除0後要補0
if(temp_self.size() < up.GetSize())
{
for (unsigned long k = 0; k<up.GetSize()-temp_self.size()-1; k++)
{
result_temp.push_back(0);
}
i=0;
}
//儲存餘數
remainder=temp_tail.m_date;
}
}
//去除第前面的元素0
std::vector<int> result_temp2=CutZero(result_temp);
if (!flag)
result_temp2[0]=result_temp2[0]*(-1);
CLong_Date result(result_temp2);
if(remainder.size()!=0 && remainder[0]!=0)
result.m_remainder=remainder;
return result;
}
CLong_Date CLong_Date::operator%(const CLong_Date &other)
{
CLong_Date result=*this/other;
return result.GetRemainder();
}
CLong_Date CLong_Date::operator+(const CLong_Date &other)
{
std::vector<int> temp_other=other.m_date;
std::vector<int> temp_self=m_date;
bool flag=true;
//同時為負
if ( (temp_other[0]<0) && (temp_self[0]<0) )
{
temp_other[0]=temp_other[0]*(-1);
temp_self[0]=temp_self[0]*(-1);
flag=false;
}
//後負前正
if ( (temp_other[0]<0) && (temp_self[0]>0) )
{
temp_other[0]=temp_other[0]*(-1);
CLong_Date pro(temp_self);
CLong_Date behind(temp_other);
return pro-behind;
}
//前負後正
if ( (temp_other[0]>0) && (temp_self[0]<0) )
{
temp_self[0]=temp_self[0]*(-1);
CLong_Date pro(temp_other);
CLong_Date behind(temp_self);
return pro-behind;
}
std::vector< std::vector<int> > result_temp;
//對齊數位,貌似沒必要,因為是倒序
/* int dif=abs(temp_other.size() - temp_self.size());
if(temp_other.size() > temp_self.size())
{
for (int i=0; i<dif; i++)
{
std::cout<<i<<std::endl;
temp_other.insert(temp_other.begin(),0);
}
}
if (temp_other.size() < temp_self.size())
{
for (int i=0; i < dif; i++)
{
std::cout<<i<<std::endl;
temp_self.insert(temp_self.begin(), 0);
}
}*/
//注意補0
temp_other.push_back(0);
std::vector<int>::iterator iter;
std::vector<int> temp;
for(iter=temp_other.end()-1;iter>=temp_other.begin();iter--)
{
temp.push_back(*iter);
}
result_temp.push_back(temp);
temp.clear();
for(iter=temp_self.end()-1;iter>=temp_self.begin();iter--)
{
temp.push_back(*iter);
}
result_temp.push_back(temp);
std::vector<int> result=Max_Aid_Max(result_temp);
std::vector<int> result2;
//記得要倒序,並且去除第一元素0
for (iter=result.end()-1; iter>result.begin(); iter--)
{
result2.push_back(*iter);
}
//標誌位
if (!flag)
result2[0]=result2[0]*(-1);
CLong_Date L_result(result2);
return L_result;
}
CLong_Date CLong_Date::operator-(const CLong_Date &other)
{
std::vector<int> temp_other=other.m_date;
std::vector<int> temp_self=m_date;
//是否新增負號
bool flag=true;
//前面為0
if (temp_self.size()==1 && temp_self[0]==0)
{
temp_other[0]=temp_other[0]*(-1);
CLong_Date behind(temp_other);
return behind;
}
//同時為負
if ( (temp_other[0]<0) && (temp_self[0]<0) )
{
temp_other[0]=temp_other[0]*(-1);
temp_self[0]=temp_self[0]*(-1);
CLong_Date pro(temp_other);
CLong_Date behind(temp_self);
return pro-behind;
}
//後負前正
if ( (temp_other[0]<0) && (temp_self[0]>0) )
{
temp_other[0]=temp_other[0]*(-1);
CLong_Date pro(temp_self);
CLong_Date behind(temp_other);
return pro+behind;
}
//前負後正
if ( (temp_other[0]>0) && (temp_self[0]<0) )
{
temp_other[0]=temp_other[0]*(-1);
CLong_Date pro(temp_other);
CLong_Date behind(temp_self);
return pro+behind;
}
//如果被減數比減數長就交換
if (temp_other.size()>temp_self.size())
{
std::vector<int> temp=temp_self;
temp_self=temp_other;
temp_other=temp;
flag=false;
}
//如果被減數比減數大就交換
else if(temp_other.size()==temp_self.size())
{
unsigned long i=0;
for(i=0;i<temp_self.size();i++)
{
if (temp_self[i]==temp_other[i])
continue;
if (temp_self[i]!=temp_other[i])
break;
}
if (temp_self[i]<temp_other[i])
{
std::vector<int> temp=temp_self;
temp_self=temp_other;
temp_other=temp;
flag=false;
}
}
std::vector< std::vector<int> > result_temp;
//注意補0
temp_other.push_back(0);
std::vector<int>::iterator iter;
std::vector<int> temp;
for(iter=temp_other.end()-1;iter>=temp_other.begin();iter--)
{
//注意這裡需要
temp.push_back(0-*iter);
}
result_temp.push_back(temp);
temp.clear();
for(iter=temp_self.end()-1;iter>=temp_self.begin();iter--)
{
temp.push_back(*iter);
}
result_temp.push_back(temp);
std::vector<int> result=Max_Aid_Max(result_temp);
//減法退位處理
int pro=0;
for (iter=result.begin(); iter!=result.end(); iter++)
{
if(pro!=0)
{
*iter=*iter+pro;
pro=0;
}
if(*iter<0)
{
*iter=*iter+10;
pro--;
}
}
std::vector<int> result2;
//記得要倒序,並且去除第前面的元素0
unsigned long count_zero=0;
iter=result.end()-1;
while (*iter==0 && iter>result.begin()+1) {
iter--;
count_zero++;
}
//並且去除第一元素0
for (iter=result.end()-1-count_zero; iter>result.begin(); iter--)
{
result2.push_back(*iter);
}
//標誌位
if (!flag)
result2[0]*=-1;
CLong_Date L_result(result2);
return L_result;
}
CLong_Date CLong_Date::operator++()
{
CLong_Date temp("1");
return *this+=temp;
}
CLong_Date CLong_Date::operator--()
{
CLong_Date temp("-1");
return *this+=temp;
}
const CLong_Date CLong_Date::operator++(int)
{
CLong_Date temp("1");
CLong_Date result=*this;
*this+=temp;
return result;
}
const CLong_Date CLong_Date::operator--(int)
{
CLong_Date temp("-1");
CLong_Date result=*this;
*this+=temp;
return result;
}
CLong_Date CLong_Date::operator+=(const CLong_Date &other)
{
return *this=*this+other;
}
CLong_Date CLong_Date::operator-=(const CLong_Date &other)
{
return *this=*this-other;
}
int CLong_Date::CheckSign()
{
if(m_date[0]>0)
return 1;
else if(m_date[0]==0)
return 0;
else
return -1;
}
unsigned long CLong_Date::GetSize()
{
return m_date.size();
}
void CLong_Date::Connect(const CLong_Date &other)
{
std::vector<int> temp_other=other.m_date;
if (temp_other[0]<0)
throw "Can't connect CLong_Date that have sign!";
std::vector<int>::iterator iter;
for(iter=temp_other.begin();iter!=temp_other.end();iter++)
m_date.push_back(*iter);
}
CLong_Date CLong_Date::GetSonHead(unsigned long len)
{
if (len > m_date.size())
throw "Can't get son from head!";
std::vector<int> temp;
for(unsigned long i=0;i<len;i++)
temp.push_back(m_date[i]);
CLong_Date result(temp);
return result;
}
CLong_Date CLong_Date::GetSonTail(unsigned long len)
{
if (len > m_date.size())
throw "Can't get son from tail!";
std::vector<int> temp;
for(unsigned long i=0;i<len;i++)
temp.push_back(m_date[m_date.size()+i-len]);
CLong_Date result(temp);
return result;
}
CLong_Date CLong_Date::GetSon(unsigned long head,unsigned long tail)
{
std::vector<int> temp;
for(unsigned long i=head-1;i<tail;i++)
temp.push_back(m_date[i]);
CLong_Date result(temp);
return result;
}
CLong_Date CLong_Date::GetRemainder()
{
CLong_Date result(m_remainder);
return result;
}
bool CLong_Date::CheckPrimeNumber()
{
CLong_Date begin("2");
if(*this==begin)
return true;
CLong_Date remainder("0");
CLong_Date end=Sqrt();
while (begin<=end)
{
CLong_Date prime=(*this/begin).GetRemainder();
if ( prime == remainder )
return false;
begin++;
}
return true;
}
CLong_Date CLong_Date::Sqrt()
{
if (CheckSign()<0)
throw "Can't calculate sqrt!";
if (CheckSign()==0)
{
CLong_Date result("0");
return result;
}
CLong_Date pro("1"),mid("2"),behind=*this;
CLong_Date result=(pro+behind)/mid;
CLong_Date judge("1");
while (1)
{
CLong_Date result_try=result*result;
if (result_try==*this)
return result;
else if(result_try<*this)
{
pro=(pro+behind)/mid;
CLong_Date result_pro=result;
result++;
result_try=result*result;
if (result_try>*this)
return result_pro;
}
if(result_try>*this)
{
behind=(pro+behind)/mid;
result--;
result_try=result*result;
if (result_try<*this)
return result;
}
result=(pro+behind)/mid;
}
}
CLong_Date CLong_Date::Abs()
{
if (CheckSign()>=0)
return *this;
else
{
CLong_Date result=*this;
result.m_date[0]=result.m_date[0]*(-1);
return result;
}
}
//protected
CLong_Date::CLong_Date(const std::vector<int> v_int)
{
m_date=v_int;
m_remainder.push_back(0);
}
//provite
std::vector<int> CLong_Date::Max_Aid_Max(std::vector<
std::vector<int> > &result)
{
std::vector<int> final;
std::vector<int>::iterator iter;
std::vector< std::vector<int> >::iterator iter_result;
//初始化
for(iter=(result.begin())->begin();iter != (result.begin())->end();
iter++)
{
final.push_back(*iter);
}
//計算
unsigned long i=1;
//儲存進位
int pro=0;
for(iter_result=result.begin()+1;iter_result!=result.end();
iter_result++,i++)
{
std::vector<int> temp_down=*(iter_result);
std::vector<int>::iterator iter_td=temp_down.begin();
for(iter=final.begin()+i;iter != final.end();
iter++,iter_td++)
{
//std::cout<<*iter<<" "<<*iter_td<<std::endl;
//底數不夠長,貌似不會出現
if (iter_td==temp_down.end())
{
break;
}
int mid=(*iter+*iter_td+pro)/10;
*iter=(*iter+*iter_td+pro)%10;
pro=mid;
}
//底數長度不足,上數要走完
while (iter!=final.end())
{
int mid=(*iter+pro)/10;
*iter=(*iter+pro)%10;
pro=mid;
iter++;
}
//上數長度不足,底數要走完
while (iter_td<temp_down.end())
{
int temp=(*iter_td+pro)/10;
final.push_back((*iter_td+pro)%10);
iter_td++;
pro=temp;
}
//注意最後可能pro沒有走完,很難發現的一個Bug
if (pro!=0)
{
while (pro>0)
{
final.push_back(pro%10);
pro=pro/10;
}
}
}
//注意最後可能pro沒有走完
if (pro!=0)
{
while (pro)
{
final.push_back(pro%10);
pro=pro/10;
}
}
return final;
}
std::vector<int> CLong_Date::Max_Max_vector(std::vector<int> &A,
std::vector<int> &B,
bool check)
{
if(A.empty() || B.empty())
{
std::cerr<<"資料不能為空!"<<std::endl;
exit(1);
}
std::vector< std::vector<int> > result;
std::vector<int>::iterator iter_A,iter_B;
int last=0;
for(iter_B=B.end()-1;iter_B>=B.begin();iter_B--)
{
std::vector<int> result_temp;
for(iter_A=A.end()-1;iter_A>=A.begin();iter_A--)
{
int temp=(*iter_A)*(*iter_B)+last;
int result_temp_int=temp%10;
last=temp/10;
result_temp.push_back(result_temp_int);
}
while(last)
{
result_temp.push_back(last%10);
last=last/10;
}
result.push_back(result_temp);
}
//測試
if(check)
{
std::cout<<std::endl<<"校驗"<<std::endl;
std::vector< std::vector<int> >::iterator iter_result;
for(iter_result=result.begin();iter_result!=result.end();
iter_result++)
{
std::vector<int>::iterator iter;
for(iter=iter_result->begin();iter != iter_result->end();
iter++)
{std::cout<<*iter;}
std::cout<<std::endl;
}
std::cout<<"校驗完畢"<<std::endl;
}
std::vector<int> final=Max_Aid_Max(result);
return final;
}
std::vector<int> CLong_Date::CutZero(std::vector<int> vet)
{
unsigned long count_zero=0;
std::vector<int> result;
std::vector<int>::iterator iter=vet.begin();
while (*iter==0 && iter<vet.end()) {
iter++;
count_zero++;
}
for (iter=vet.begin()+count_zero;iter!=vet.end();iter++)
{
result.push_back(*iter);
}
return result;
}
測試檔案(main.cpp):
#include <iostream>
#include <fstream>
#include "CLong_Date.h"
using namespace std;
int main(int argc, const char * argv[])
{
string str1("6653340"),str2("1100240"),str3("20");
//計時
clock_t timeBegin, timeEnd;
timeBegin = clock();
/* CLong_Date A(str1),B(str2),C(str3);
cout<<A<<endl;
cout<<B<<" "<<C<<endl;
cout<<B/C<<endl;
cout<<(B*C)/C<<endl;*/
cout<<"prime number:"<<endl;
CLong_Date prime("100000");
CLong_Date end("110000");
cout<<"begin:"<<prime<<endl
<<" end:"<<end<<endl;
if(prime.CheckPrimeNumber())
cout<<prime<<endl;
ofstream fout("prime.txt");
while (prime<end)
{
if(prime.CheckPrimeNumber())
{
cout<<prime<<endl;
fout<<prime<<endl;
}
prime++;
}
fout.close();
// cout<<(B/C).GetRemainder()<<endl;
// cout<<B.GetSon(1,3)<<endl<<endl;
/* cout<<(A-A)<<endl;
cout<<(A-A)+B<<endl;
cout<<(B-A)+(B)<<endl;
cout<<(B-A)-A<<endl;
cout<<(A*C)<<endl;
A.Connect(B);*/
/* A+=B;
cout<<A<<endl;
cout<<A.GetSize()<<endl;
if(A<B)
cout<<"A小於B"<<endl;
if(A>B)
cout<<"A大於B"<<endl;
if(B<A)
cout<<"B小於A"<<endl;
if(B>A)
cout<<"B大於A"<<endl;
CLong_Date google_pro("39999999999999999"),google_behind("39999999999999998");
cout<<google_pro-google_behind<<endl;
cout<<"2的次方:"<<endl;
CLong_Date index("1"),index_2("2");
for (int i=0; i<256; i++)
{
index=index_2*index;
}
cout<<index<<endl<<endl;*/
timeEnd = clock();
cout<<"Cost time is:"<<(double)(timeEnd-timeBegin)/ CLOCKS_PER_SEC<<"秒"<<endl;
return 0;
return 0;
}
本次是我第一次寫部落格,如有問題請多包涵,若發現bug請給予修正,不慎感激。
相關文章
- 大資料學習:抽象類大資料抽象
- 四大類NOSQL資料庫SQL資料庫
- 沈浩:大資料感知人類社會大資料
- 八大資料結構分類大資料資料結構
- 大資料架構和模式(一)——大資料分類和架構簡介大資料架構模式
- 大資料,大資料,大資料大資料
- 大資料分類和架構簡介大資料架構
- 大資料分析標準如何進行分類大資料
- Python有哪些資料探勘工具?五大類Python
- 大資料簡介,技術體系分類整理大資料
- 大資料要學習哪些技術呢?大資料技術的分類與選擇路線大資料
- 資料分類
- 好程式設計師大資料教程Scala系列之類程式設計師大資料
- 微控制器介面類資料大彙總50冊
- python常用的資料庫有哪些?五大類!Python資料庫
- Python資料型別是什麼?七大類!Python資料型別
- 計算機如何感知大資料——聚類演算法計算機大資料聚類演算法
- NoSQL資料庫的四大分類及分析SQL資料庫
- NoSQL資料庫的四大分類介紹SQL資料庫
- 巧用Superset大資料分析平臺搞定各類圖表大資料
- 走進大資料,感受大資料大資料
- 大資料VS大擁堵:大資料治理交通大資料
- 大資料資料收集大資料
- 大資料概念:史上最全大資料解析大資料
- 大資料大利潤–資料資訊圖大資料
- 大資料Scala系列之樣例類_Option_偏函式大資料函式
- 大資料時代,財經類媒體人需要掌握哪些技能大資料
- Michael Jordan:類腦晶片和大資料或是場空歡喜晶片大資料
- 大資料與資訊保安(六)天網系統與大資料 大資料大資料
- Kotlin 資料類Kotlin
- MySql 資料操作類MySql
- 大資料如何採集資料?大資料的資料從何而來?大資料
- 大資料:大資料之基礎語法大資料
- 大資料治理——搭建大資料探索平臺大資料
- 什麼叫大資料 大資料的概念大資料
- 大資料筆記01--大資料概述大資料筆記
- 大資料hadoop資料大資料Hadoop
- 大資料學習資料大資料