1. 程式人生 > >用c# 採用BIT-map 方式,從一堆資料中,找出不重複的

用c# 採用BIT-map 方式,從一堆資料中,找出不重複的

採用的是bit-map演算法,關於什麼是bit-map,百度一下;

直接上一段程式碼,用C#改寫的!

如下:

 class Program
    {
        private static int[] flags = new int[1000000];
        private static DateTime starttime = new DateTime();
        private static int  get_val( int idx)
        {
            int i = idx/4;
            int j = idx%4;
            int ret = (flags[i]&(0x3<<(2*j)))>>(2*j);  
  
            return ret;
        }


        private static int set_val(int idx,int val) 
        {
            int i = idx / 4;
            int j = idx % 4;
            int tmp = (flags[i] & ~((0x3 << (2 * j)) & 0xff)) | (((val % 4) << (2 * j)) & 0xff);
            flags[i] = tmp;
            return 0;
        }


        private static int add_one(int idx)
        {
            if (get_val(idx) >=2 )
            {
                return 1;
            }
            else
            {
                set_val(idx,get_val(idx)+1);
                return 0;
            }
        }


        
        static void Main(string[] args)
        {
            int[] value={10,5,392,49,24,0,95,20,9098,20340,900934,290390,5,95,20340,29039,5};
            Console.WriteLine("原陣列!");
            foreach (int item in value)
            {
                Console.Write(item+" ");
                add_one(item);
            }
            Console.WriteLine("\n\n只出現過一次的數是:");
            starttime = DateTime.Now;
            for (int i = 0; i < 1000000; ++i)
            {
                if (get_val(i)==1)
                {
                    Console.WriteLine(i);
                }
            }
            string processTimet = ExecDateDiff(starttime, DateTime.Now);
            Console.WriteLine("共用時{0}",processTimet);
             


            Console.Read();
        }
        /// <summary>
        /// 計算兩個時間之間的差值。
        /// </summary>
        /// <param name="dateBegin"></param>
        /// <param name="dateEnd"></param>
        /// <returns></returns>
        public static string ExecDateDiff(DateTime dateBegin, DateTime dateEnd)
        {
            TimeSpan ts1 = new TimeSpan(dateBegin.Ticks);
            TimeSpan ts2 = new TimeSpan(dateEnd.Ticks);
            TimeSpan ts3 = ts1.Subtract(ts2).Duration();
            //你想轉的格式
            return ts3.TotalMilliseconds.ToString() + "毫秒";
        }
    }

執行結果如下:


相關推薦

c# 採用BIT-map 方式資料重複

採用的是bit-map演算法,關於什麼是bit-map,百度一下; 直接上一段程式碼,用C#改寫的! 如下:  class Program     {         private static int[] flags = new int[1000000];    

符號、Tab等等方式正在劃分的文字塊取出指定了位置的文字塊

取字符串 sep extract 所在 CA col 字符串 截取 指定 Public Function StrExtract(ByRef sStr As String, ByRef iCol As Short, ByRef sSeparater As String

C++採用記憶體對映方式高效率讀寫大資料

       在有時候,專案的資料量特別大,而且源源不斷的到來,這個時候,利用傳統的IO檔案流寫檔案勢必效率很低跟不上節奏。我這裡的場景是:生存者A,消費者B,訊息佇列C。A高速生產資料並快取至C,B不停的從C取資料,並寫入本地檔案。不妨採用記憶體對映方式來寫檔案,達到高效

天平(只能比較能稱重)小球其中唯一一個較輕的使用x次天平

1.用天平(只能比較,不能稱重)從一堆小球中找出其中唯一一個較輕的,使用x次天平, 最多可以從y個小球中找出較輕的那個,求y與x的關係式。 ----------------------------------------------- All other balls a

the silver searcher與alfred檔案快速查詢資訊

the silver searcher真的好快 之前自己寫了個讀取檔案內容查詢字串,由於讀取整個檔案內容所以佔用記憶體很大。 現在發現ag(the_silver_searcher)這個好工具,真快,4個檔案共9G只用了70秒。 如下,資料夾中有480M檔案 再配合alfre

如何選出若干個數使其和等於給定的數?

如題,比如有一堆數:13,2,4,2,4,8,7,8,6 要從中挑選出若干個數,使得它們的和等於32,挑選出來的數是:20,6,4,2 我是使用“試探”法來解這個題目,思路如下: 先對數進行排序:13,8,8,7,6,4,4,2,2 選出最大的數字,以及不大於目標數字後續數字,於是我挑選到

近日有需要寫點C#程式有用到Dataset資料集和SQLite資料庫由於我從來就擅長記各種程式語言的語法所以在查閱資料留下以下內容備忘: 、SQLite操作直接貼程式碼很簡單

近日有需要寫點C#程式,有用到Dataset資料集和SQLite資料庫,由於我從來就不擅長記各種程式語言的語法,所以在查閱一堆資料後,留下以下內容備忘:   一、SQLite操作,直接貼程式碼,很簡單:       //建立一個數據庫檔案     string  d

div選擇display=block的div

<pre name="code" class="html">$(".commonCss").each(function (i,element) { if($(element).css("display") == 'block'){

刪除資料重複資料的兩種方法(單鏈表與線性表)c++

前言   第一次寫部落格,問題雖然簡單,但是我寫的很認真的,,儘量將自己的思路寫的清晰,大神若路過請不要見笑(還望多多指點),真誠的希望我寫的東西能幫助到一些 人,有問題或錯誤都可以提,讓我們共同進步! 1.問題概述   在一堆資料中可能存在重複的資料,請將重

C語言陣列1. 簡單約瑟夫環問題: N個人編號1~N圍成輸入個數T,從1號開始報數報到T的人圈;下人又1開始報數下一個報到T的人輸出圈順序。 考慮問實現約瑟夫環問題

1. 簡單約瑟夫環問題: N個人,編號從1~N圍成一圈,輸入一個數T,從1號開始報數,報到T的人出圈;下一人又從1開始報數,下一個報到T的人出圈,輸出出圈順序。 考慮問題: 報到T的人出圈,怎麼表示出圈?要麼刪除對應的標號,其他的標號前移(如果是陣列結構,要依次移動

短網址生成方法,生成一個唯一的短字符串。 然後保存到數據庫與源數據一一對應,新的系統數據庫取到相應的數據 (轉)

hash parseint uid += 不用 裏的 我想 ger vrf /** * 短網址生成方法 * 這個方法會,生成四個短字符串,每一個字符串的長度為6 * 這個方法是從網上搜索的一個方法,但不知道出自何處了,稍微將key換了一下

java入門練習題(三):讀入組整數(超過20個)戶輸入0時表示輸入結束;然後程式將這組整數把第二大的整數出來並把它打印出來。

 程式意義:讀入一組整數(不超過20個),當用戶輸入0時,表示輸入結束;然後程式將從這組整數中,把第二大的整數找出來,並把它打印出來。  說明:(1)0表示輸入結束,它本身並不計入這組整數中。            (2)在這組整數中,既有整數又有負數;          

Java呼叫R 資料庫讀取資料R根據讀取的資料生成圖片儲存

Java呼叫R 以及用R生成的圖片儲存 使用 png()可以保證圖片質量 有人說繪製的圖片上有中文會出現亂碼,其實設定下字型就好了 family=‘STXihei’ Java呼叫R 以及用R生成的圖片儲存 Rserve的配置和啟動: ①安裝Rserve包。

Mysql查詢的結果寫入txt檔案每個欄位|分隔資料要換行

1.首先建立檔案 public static boolean createFile(String fileName, List<?> dtoList, Class<?> clazz, String path) { logger.debug("createF

android採用Chrome Intent方式實現瀏覽器啟動應用

在很多應用中需要我們從瀏覽器中直接啟動應用,而網上大多數採用的是scheme的方式,即在啟動activity的mainfest檔案中配置如下欄位:<activity android:name=”com.example.MainActivity”> <i

給R1的DLNA.apkN1提取打包簽名方便播放

push all one ucc start ins 打包 方便 system 這個小巧的DLNA客戶端比樂播更適合R1。從N1提取,正好airplay只有音頻功能。不過需要使用安卓投屏設置一下自啟動才能使用需要使用安卓投屏設置一下自啟動才能使用需要使用安卓投屏設置一下自啟

C# NAudio錄音和播放音訊檔案-實時繪製音訊波形圖(音訊流資料獲取而非裝置獲取)

  NAudio的錄音和播放錄音都有對應的類,我在使用Wav格式進行錄音和播放錄音時使用的類時WaveIn和WaveOut,這兩個類是對功能的回撥和一些事件觸發。   在WaveIn和WaveOut之外還有對音訊流讀寫使用的WaveFileWriter和WaveFileReader類,具體細節可檢視其原始碼進

更新表字段另一個表查詢出來

code upd 另一個 查詢 print ng- ble where sql UPDATE t SET t.Premium = (SELECT TOP 1 Max( t2.Premium ) FROM dbo.TableName t

kafka-connect-hdfs重啟進去RECOVERY狀態hadoop hdfs拿租約很正常但是也太久了吧

not handle 個人 ret sun response sass pre sub 雖說這個算是正常現象,等的時間也太久了吧。分鐘級了。這個RECOVERY裏面的WAL有點多余。有這麽久的時間,早從新讀取kafka寫入hdfs了。純屬個人見解。 @SuppressWa