主頁 > 軟體設計 > 實驗八 查找演算法比較

實驗八 查找演算法比較

2020-12-29 12:03:18 軟體設計

實驗八 查找

實驗目的

基于教材內容,從順序查找、二分查找、基于BST的查找和哈希中任選兩種查找演算法,實作并比較性能,

基本要求

(1)對實作的查找演算法進行實驗比較,在不同資料規模(N)下執行100次成功查找,以表格形式記錄最小、最大和平均查找時間;在不同資料規模(N)下執行100次不成功查找,以表格形式記錄最小、最大和平均查找時間,

(2)查找演算法要基于教材,測驗輸入的整數資料檔案(5個,檔案中資料規模N分別是100,1K,10K,100K和1M),每次查找的比較次數和時間也要輸出到檔案中,

(3)提交最終實驗作業,用附件的形式,提交兩個檔案:一個壓縮包(包含原始碼和5個用于查找測驗的資料檔案);一個pdf檔案(檔案中包含實驗日志和一個根據基本要求(1)記錄實驗結果的表格,然后進行適當的實驗結果分析),

本次實驗的重點在于加強對順序查找、二分查找、基于BST的查找和哈希等查找演算法的認識和性能的分析,(在此次實驗中我選擇了順序查找和哈希查找,所以以下日志內容主要是本人對兩種查找演算法的認識)

  1. 順序查找:

顧名思義,順序查找即依次從前向后查找,是一種易于理解、易于實作,但耗時較多的查找方式,

  1. 查找程序

    首先,將待查找資料與表內的第一個資料進行比對,如果相同則表明查找成功,如果不相同,則與第二個資料進行對比,重復以上程序,直到找到匹配的資料,使查找成功,或直到查找到表的最后一位依舊不匹配,此時表明該資料不存在,查找不成功,

  2. 演算法要求

必須采用順序存盤結構,

  1. 比較次數

    當順序表有n個關鍵字時:

    查找失敗時,比較max次關鍵字;查找成功時,比較n次關鍵字(n即為回圈次序),

  2. 演算法復雜度

    順序查找的基本思想是一次向后查找,若找到就停止,若一直到最后都未找到,則表明查找失敗,

    時間復雜度是O(n)

  3. Hash查找

    哈希查找是通過計算資料元素的存盤地址進行查找的一種方法,

  4. 定義

    哈希查找的操作步驟:

    ⑴用給定的哈希函式構造哈希表;

    ⑵根據選擇的沖突處理方法解決地址沖突;

    ⑶在哈希表的基礎上執行哈希查找

  5. 操作步驟

    step1
    取資料元素的關鍵字key,計算其哈希函式值,若該地址對應的存盤空間還沒有被占用,則將該元素存入;

    否則執行step2解決沖突,

    step2
    根據選擇的沖突處理方法,計算關鍵字key的下一個存盤地址,若下一個存盤地址仍被占用,則繼續執行step2,直到找到能用的存盤地址為止,

    哈希查找步驟為:

    設哈希表為HST[0~M-1],哈希函式取H(key),解決沖突的方法為R(x);

    Step1 對給定k值,計算哈希地址 Di=H(k);若HST為空,則查找失敗;

    若HST=k,則查找成功;否則,執行step2(處理沖突),

    Step2 重復計算處理沖突的下一個存盤地址 Dk=R(Dk-1),直到HST[Dk]為

    空,或HST[Dk]=k為止,若HST[Dk]=K,則查找成功,否則查找失敗,

    哈希查找的本質是先將資料映射成它的哈希值,哈希查找的核心是構造一個哈希函式,它將原來直觀、整潔的資料映射為看上去似乎是隨機的一些整數,

    哈希查找的產生有這樣一種背景——有些資料本身是無法排序的(如影像),有些資料是很難比較的(如影像),如果資料本身是無法排序的,就不能對它們進行比較查找,如果資料是很難比較的,即使采用折半查找,要比較的次數也是非常多的,因此,哈希查找并不查找資料本身,而是先將資料映射為一個整數(它的哈希值),并將哈希值相同的資料存放在同一個位置一即以哈希值為索引構造一個陣列,

    在哈希查找的程序中,只需先將要查找的資料映射為它的哈希值,然后查找具有這個哈希值的資料,這就大大減少了查找次數,如果構造哈希函式的引數經過精心設計,記憶體空間也足以存放哈希表,查找一個資料元素所需的比較次數基本上就接近于一次,

  6. 解決沖突

    影響哈希查找效率的一個重要因素是哈希函式本身,當兩個不同的資料元素的哈希值相同時,就會發生沖突,為減少發生沖突的可能性,哈希函式應該將資料盡可能分散地映射到哈希表的每一個表項中,解決沖突的方法有以下兩種:

    (1) 開放地址法

    如果兩個資料元素的哈希值相同,則在哈希表中為后插入的資料元素另外選擇一個表項,

    當程式查找哈希表時,如果沒有在第一個對應的哈希表項中找到符合查找要求的資料元素,程式就會繼續往后查找,直到找到一個符合查找要求的資料元素,或者遇到一個空的表項,

    (2) 鏈地址法

    將哈希值相同的資料元素存放在一個鏈表中,在查找哈希表的程序中,當查找到這個鏈表時,必須采用線性查找方法,

  7. 查找結果

查找演算法Hash查找(成功)
資料規模1001k10k100k1M
最小查找時間(單位:ms)00000
最大查找時間(單位:ms)0.00010.00010.00010.00010.0001
平均查找時間(單位:ms)2e-0051.4e-0051e-0052.2e-0051.3e-005
查找演算法Hash查找(失敗)
資料規模1001k10k100k1M
最小查找時間(單位:ms)00000
最大查找時間(單位:ms)0.00010.00010.00010.00020.0001
平均查找時間(單位:ms)2.5e-0051.8e-0052.6e-0052.7e-0051.9e-005
查找演算法順序查找(成功)
資料規模1001k10k100k1M
最小查找時間(單位:ms)00.00010.00010.00110.043
最大查找時間(單位:ms)0.00140.01310.02990.60882.5673
平均查找時間(單位:ms)0.0002240.0017440.0120860.12561.24673
查找演算法順序查找(失敗)
資料規模1001k10k100k1M
最小查找時間(單位:ms)2.08652.08582.08132.083112.0834
最大查找時間(單位:ms)3.45842.92833.01022.75193.2602
平均查找時間(單位:ms)2.266782.235462.235692.217322.21285

實驗結果分析:

Hash查詢時間幾乎為0,所花時間基本上是在建立hash表時,hash查找較順序查找的優勢體資料量越大越明顯.從理論上來看,hash查找的時間復雜度為O(1),順序查找的則為O(n);hash查找的劣勢是建hash表花時間過多,當然這也跟hash表的設計有關;
從實驗來看,hash查找用于資料量巨大,查詢頻繁的情況下.
知道了上面這些后,我們就開始寫代碼
(1)首先是亂數檔案的生成,方法有很多,額外創建success和fail的txt檔案,用于對亂數的成功和失敗的查找,
如下
在這里插入圖片描述
生成后的檔案如下圖所示
在這里插入圖片描述
在這里插入圖片描述

(2)接下來是對每一組測驗資料分別進行100次成功和失敗查找

/*
 Created by Small-cai
 Data: 12/28 12:56
*/
#include <iostream>
#include <time.h>
#include <iomanip>
#include <windows.h>
#include <fstream>
#include <algorithm>
using namespace std;
LARGE_INTEGER frequency;
int S[105]={0},F[105]={0};
const int maxn=1000000;
int A[maxn+5]={0},B[maxn+5]={0};
double dff,begin_,_end,dfm,dft;
void Init(ifstream &infile,int M[maxn])
{
    int a,i=0;
    while(!infile.eof()&&i<maxn)
    {
        infile>>a;
        M[i]=a;
        i++;
    }
}
void Init(ifstream &infile,int M[maxn],int N[maxn])
{
    int a,i=0,key;
    fill(N,N+maxn,-1);
    while(!infile.eof()&&i<maxn)
    {
        infile>>a;
        M[i]=a;
        key=a%maxn;
        N[key]=a;//key(x)=x;hash函式定義為線性hash
        i++;
    }
}
void search_sequential(ofstream& outfile,int A[maxn],int n)//順序查找
{
    sort(A,A+n);//升序排列
    int x;
    int num=0;//中間值和比較次數
    double mints=100,maxts=0,averages=0;
    double mintf=100,maxtf=0,averagef=0;
    bool flag;
    cout<<"-----------------順序查找成功------------------\n";outfile<<"-----------------順序查找成功------------------\n";
    for(int i=0;i<100;i++)//100次成功查找
    {
        x=S[i];//確定待查找的數x
        num=0;//初始化查找次數為0
        flag=0;
        QueryPerformanceCounter(&frequency);
        begin_=frequency.QuadPart;//獲得初始值
        int j=0;
        while(j<maxn+5)//順序查找
        {
            num++;
            if(A[j]==x)
            {
                flag=1;//查找成功
                break;
            }
            else j++;
        }
        QueryPerformanceCounter(&frequency);
        _end=frequency.QuadPart;//獲得終止值
        dfm=(double)(_end-begin_);//差值
        dft=dfm/dff;//差值除以頻率得到時間
        if(flag)//查找成功
        {
            cout<<"順序查找記錄->"<<x<<"->成功         "<<"查找次數: "<<num<<"次";
            outfile<<"順序查找記錄:"<<x<<"->成功          "<<"查找次數: "<<num<<"次";
        }
        else
        {
            cout<<"順序查找記錄->"<<x<<"->失敗         "<<"查找次數: "<<num<<"次";
            outfile<<"順序查找記錄:"<<x<<"->失敗          "<<"查找次數: "<<num<<"次";
        }
        cout<<"查找時間: "<<dft*1000<<"ms"<<endl;
        outfile<<"查找時間: "<<dft*1000<<"ms"<<endl;
        mints=min(mints,dft*1000);//最小時間
        maxts=max(maxts,dft*1000);//最大時間
        averages+=dft*10;//平均時間
    }
    cout<<"\n-----------------順序查找失敗------------------\n";outfile<<"-----------------順序查找失敗------------------\n";
    for(int i=0;i<100;i++)//100次失敗查找
    {
        x=F[i];//確定待查找的數x
        num=0;//初始化查找次數為0
        flag=0;
        QueryPerformanceCounter(&frequency);
        begin_=frequency.QuadPart;//獲得初始值
        int j=0;
        while(j<maxn+5)//順序查找
        {
            num++;
            if(A[j]==x)
            {
                flag=1;//查找成功
                break;
            }
            else j++;
        }
        QueryPerformanceCounter(&frequency);
        _end=frequency.QuadPart;//獲得終止值
        dfm=(double)(_end-begin_);//差值
        dft=dfm/dff;//差值除以頻率得到時間
        if(flag)//查找成功
        {
            cout<<"順序查找記錄->"<<x<<"->成功         "<<"查找次數: "<<num<<"次";
            outfile<<"順序查找記錄:"<<x<<"->成功          "<<"查找次數: "<<num<<"次";
        }
        else
        {
            cout<<"順序查找記錄->"<<x<<"->失敗         "<<"查找次數: "<<num<<"次";
            outfile<<"順序查找記錄:"<<x<<"->失敗          "<<"查找次數: "<<num<<"次";
        }
        cout<<"查找時間: "<<dft*1000<<"ms"<<endl;
        outfile<<"查找時間: "<<dft*1000<<"ms"<<endl;
        mintf=min(mintf,dft*1000);//最小時間
        maxtf=max(maxtf,dft*1000);//最大時間
        averagef+=dft*10;//平均時間
    }
    cout<<"順序查找成功:\n最小查找時間"<<mints<<"ms       "<<"最大查找時間"<<maxts<<"ms       "<<"平均查找時間"<<averages<<"ms\n查找結束\n";
    outfile<<"順序查找成功:\n最小查找時間"<<mints<<"ms       "<<"最大查找時間"<<maxts<<"ms       "<<"平均查找時間"<<averages<<"ms\n查找結束\n";
    cout<<"順序查找失敗:\n最小查找時間"<<mintf<<"ms       "<<"最大查找時間"<<maxtf<<"ms       "<<"平均查找時間"<<averagef<<"ms\n查找結束\n";
    outfile<<"順序查找失敗:\n最小查找時間"<<mintf<<"ms       "<<"最大查找時間"<<maxtf<<"ms       "<<"平均查找時間"<<averagef<<"ms\n查找結束\n";
}
void search_hash(ofstream &outfile,int B[maxn])//hash散列查找
{
    int x,num=1,key,y;
    double mints=100,maxts=0,averages=0;
    double mintf=100,maxtf=0,averagef=0;
    bool flag;
    cout<<"-----------------hash查找成功------------------\n";outfile<<"-----------------hash查找成功------------------\n";
    for(int i=0;i<100;i++)//100次失敗查找
    {
        flag=0;
        x=S[i],key=x%maxn,y=B[key];
        QueryPerformanceCounter(&frequency);
        begin_=frequency.QuadPart;//獲得初始值
        if(y==x) flag=1;//查找成功
        QueryPerformanceCounter(&frequency);
        _end=frequency.QuadPart;//獲得終止值
        dfm=(double)(_end-begin_);//差值
        dft=dfm/dff;//差值除以頻率得到時間
        if(flag)
        {
            cout<<"hash查找記錄:"<<x<<"->成功          "<<"查找次數:"<<num<<" 次";
            outfile<<"hash查找記錄:"<<x<<"->成功          "<<"查找次數:"<<num<<" 次";
        }
        else
        {
            cout<<"hash查找記錄:"<<x<<"->失敗          "<<"查找次數:"<<num<<" 次";
            outfile<<"hash查找記錄:"<<x<<"->失敗          "<<"查找次數:"<<num<<" 次";
        }
        cout<<"查找時間: "<<dft*1000<<"ms"<<endl;
        outfile<<"查找時間: "<<dft*1000<<"ms"<<endl;
        mints=min(mints,dft*1000);//最小時間
        maxts=max(maxts,dft*1000);//最大時間
        averages+=dft*10;//平均時間
    }
    cout<<"-----------------hash查找失敗------------------\n";outfile<<"-----------------hash查找失敗------------------\n";
    for(int i=0;i<100;i++)//100次失敗查找
    {
        flag=0;
        x=F[i],key=x%maxn,y=B[key];
        QueryPerformanceCounter(&frequency);
        begin_=frequency.QuadPart;//獲得初始值
        if(y==x) flag=1; //查找成功
        QueryPerformanceCounter(&frequency);
        _end=frequency.QuadPart;//獲得終止值
        dfm=(double)(_end-begin_);//差值
        dft=dfm/dff;//差值除以頻率得到時間
        if(flag)
        {
            cout<<"hash查找記錄:"<<x<<"->成功          "<<"查找次數:"<<num<<" 次";
            outfile<<"hash查找記錄:"<<x<<"->成功          "<<"查找次數:"<<num<<" 次";
        }
        else
        {
            cout<<"hash查找記錄:"<<x<<"->失敗          "<<"查找次數:"<<num<<" 次";
            outfile<<"hash查找記錄:"<<x<<"->失敗          "<<"查找次數:"<<num<<" 次";
        }
        cout<<"查找時間: "<<dft*1000<<"ms"<<endl;
        outfile<<"查找時間: "<<dft*1000<<"ms"<<endl;
        mintf=min(mintf,dft*1000);//最小時間
        maxtf=max(maxtf,dft*1000);//最大時間
        averagef+=dft*10;//平均時間
    }
    cout<<"hash查找成功:\n最小查找時間"<<mints<<"ms       "<<"最大查找時間"<<maxts<<"ms       "<<"平均查找時間"<<averages<<"ms\n查找結束\n";
    outfile<<"hash查找成功:\n最小查找時間"<<mints<<"ms       "<<"最大查找時間"<<maxts<<"ms       "<<"平均查找時間"<<averages<<"ms\n查找結束\n";

    cout<<"hash查找失敗:\n最小查找時間"<<mintf<<"ms       "<<"最大查找時間"<<maxtf<<"ms       "<<"平均查找時間"<<averagef<<"ms\n查找結束\n";
    outfile<<"hash查找失敗:\n最小查找時間"<<mintf<<"ms       "<<"最大查找時間"<<maxtf<<"ms       "<<"平均查找時間"<<averagef<<"ms\n查找結束\n";
}
int main()
{
    QueryPerformanceFrequency(&frequency);//獲得時鐘頻率
    dff=(double)frequency.QuadPart;//取得頻率*/
    ifstream in_100("100.txt"),in_1k("1k.txt"),in_10k("10k.txt"),in_100k("100k.txt"),in_1M("1M.txt");//輸入測驗資料檔案
    ifstream sucess("sucess.txt"),fail("fail.txt");//輸入查找資料
    ofstream out_100("out_100.txt"),out_1k("out_1k.txt"),out_10k("out_10k.txt"),out_100k("out_100k.txt"),out_1M("out_1M.txt");
    Init(sucess,S);//輸入查找資料
    Init(fail,F);//輸入查找資料

    Init(in_100,A,B);//初始化
    cout<<"對規模為100的檔案進行查找:"<<endl;out_100<<"對規模為100的檔案進行查找:"<<endl;
    cout<<"hash散列查找開始:\n";
    search_hash(out_100,B);//順序查找
    cout<<"-----------------------------------------\n";out_100<<"-----------------------------------------\n";
    cout<<"順序查找開始:\n";
    search_sequential(out_100,A,100);//順序查找

    Init(in_1k,A,B);//初始化
    cout<<"對規模為1k的檔案進行查找:"<<endl;out_1k<<"對規模為1k的檔案進行查找:"<<endl;
    cout<<"hash散列查找開始:\n";
    search_hash(out_1k,B);//順序查找
    cout<<"-----------------------------------------\n";out_1k<<"-----------------------------------------\n";
    cout<<"順序查找開始:\n";
    search_sequential(out_1k,A,1024);//順序查找

    Init(in_10k,A,B);//初始化
    cout<<"對規模為10k的檔案進行查找:"<<endl;out_10k<<"對規模為10k的檔案進行查找:"<<endl;
    cout<<"hash散列查找開始:\n";
    search_hash(out_10k,B);//順序查找
    cout<<"-----------------------------------------\n";out_10k<<"-----------------------------------------\n";
    cout<<"順序查找開始:\n";
    search_sequential(out_10k,A,10240);//順序查找

    Init(in_100k,A,B);//初始化
    cout<<"對規模為100k的檔案進行查找:"<<endl;out_100k<<"對規模為100k的檔案進行查找:"<<endl;
    cout<<"hash散列查找開始:\n";
    search_hash(out_100k,B);//順序查找
    cout<<"-----------------------------------------\n";out_100k<<"-----------------------------------------\n";
    cout<<"順序查找開始:\n";
    search_sequential(out_100k,A,102400);//順序查找

    Init(in_1M,A,B);//初始化
    cout<<"對規模為1M的檔案進行查找:"<<endl;out_1M<<"對規模為1M的檔案進行查找:"<<endl;
    cout<<"hash散列查找開始:\n";
    search_hash(out_1M,B);//順序查找
    cout<<"-----------------------------------------\n";out_1M<<"-----------------------------------------\n";
    cout<<"順序查找開始:\n";
    search_sequential(out_1M,A,1048576);//順序查找
    return 0;
}


最后,檔案下多出
在這里插入圖片描述
信安應憐兒和你一起努力~

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/241892.html

標籤:其他

上一篇:專案實戰:小米商城官網及秒殺高仿(html+css+js)

下一篇:SpringBoot中starter場景啟動器

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more