PHP實現bitmap位元影像排序與求交集的方法_php技巧

來源:互聯網
上載者:User

本文執行個體講述了PHP實現bitmap位元影像排序求交集的方法。分享給大家供大家參考,具體如下:

初始化一串全為0的二進位;

現有一串無序的整數數組;

如果整數x在這個整數數組當中,就將二進位串的第x位置為1;

然後順序讀取這個二進位串,並將為1的位轉換成整數,順序存放到新的集合中,就是排好序的了

排序代碼:

function sort(){    // var_dump(PHP_INT_MAX, PHP_INT_SIZE);    // int 9223372036854775807    // int 8    $bitmap = array_fill(0, 50, 0); //申請一個整形數組, 50個元素, 初始化為整數0    $int_bit_size = PHP_INT_SIZE * 8; //$bitmap中每個整形的二進位位元 (本例中int = 8*8 = 64bit; $bitmap數組一共50*64 = 3200個bit位),也就是說能為最大值小於等於3200的整數集合排序    $a = array(1,4,3,50,34,60,100,88,200,150,300); //定義一個亂序的數組    //掃描$a中的每一個數, 將其轉換為 x*64 + y    foreach ($a as $k => $v) {      $shang = $v / $int_bit_size;      $yushu = $v % $int_bit_size;      $offset = 1 << $yushu;      $bitmap[$shang] = $bitmap[$shang] | $offset;//將bit位置為1    }    //將$bitmap中的bit位依次還原為整數輸出,即可得到排序後的數組    $b = array();    foreach ($bitmap as $k => $v) {      for ($i = 0; $i < $int_bit_size; $i++) {        $tmp = 1 << $i;        $flag = $tmp & $bitmap[$k];        // $b[] = $flag ? $k * $int_bit_size + $i : false;        if ($flag) {          $b[] = $k * $int_bit_size + $i;        }      }    }    var_dump($b);exit;}

瀏覽器輸出:

array
  0 => int 1
  1 => int 3
  2 => int 4
  3 => int 34
  4 => int 50
  5 => int 60
  6 => int 88
  7 => int 100
  8 => int 150
  9 => int 200
  10 => int 300

求交集代碼:

public function sort($a = array()){    // var_dump(PHP_INT_MAX, PHP_INT_SIZE);    // int 9223372036854775807    // int 8    $bitmap = array_fill(0, 50, 0); //申請一個整形數組, 50個元素, 初始化為整數0    $int_bit_size = PHP_INT_SIZE * 8; //$bitmap中每個整形的二進位位元 (本例中int = 8*8 = 64bit; $bitmap數組一共50*64 = 3200個bit位)    // $a = array(1,4,3,50,34,60,100,88,200,150,300); //定一個亂序的數組    //掃描$a中的每一個數, 將其轉換為 x*64 + y    foreach ($a as $k => $v) {      $shang = $v / $int_bit_size;      $yushu = $v % $int_bit_size;      $offset = 1 << $yushu;      $bitmap[$shang] = $bitmap[$shang] | $offset;//將bit位置為1    }    return $bitmap;  }  public function intersect()  {    $int_bit_size = PHP_INT_SIZE * 8;    $a = array(1,4,3,50,34,60,100,88,200,150,300);    $b = array(1,5,3,50,34,55,100,87,222,150,300);    $bit_a = $this->sort($a);    $bit_b = $this->sort($b);    $c = array();    foreach ($bit_a as $k => $v) {      $c[$k] = $bit_a[$k] & $bit_b[$k]; //二進位 & 計算求交集    }    $d = array();    foreach ($c as $k => $v) {      for ($i = 0; $i < $int_bit_size; $i++) {        $tmp = 1 << $i;        $flag = $tmp & $c[$k];        // $b[] = $flag ? $k * $int_bit_size + $i : false;        if ($flag) {          $d[] = $k * $int_bit_size + $i;        }      }    }    var_dump($d);exit;}

瀏覽器輸出:

array
  0 => int 1
  1 => int 3
  2 => int 34
  3 => int 50
  4 => int 100
  5 => int 150
  6 => int 300

更多關於PHP相關內容感興趣的讀者可查看本站專題:《PHP數組(Array)操作技巧大全》、《php排序演算法總結》、《PHP常用遍曆演算法與技巧總結》、《PHP資料結構與演算法教程》、《php程式設計演算法總結》、《PHP數學運算技巧總結》、《phpRegex用法總結》、《PHP運算與運算子用法總結》、《php字串(string)用法總結》及《php常見資料庫操作技巧匯總》

希望本文所述對大家PHP程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.