主頁 >  其他 > 快速排序--洛谷卡TLE后最終我還是選擇了三向切割

快速排序--洛谷卡TLE后最終我還是選擇了三向切割

2021-11-09 09:49:18 其他

寫在前邊

這篇文章呢,我們接著聊一下排序演算法,我們之前已經談到了簡單插入排序 和ta的優化版希爾排序 ,這節我們要接觸一個更“高級”的演算法了--快速排序,
在做洛谷的時候,遇到了一道卡優化的題,如果沒有去對快排進行優化的話,會有幾個點是TLE的,后邊我們可以圍繞這道題來做各種優化,先來認識一下快速排序,

思路

假如我們的計算機每秒鐘可以運行 10 億次,那么對 1 億個數進行排序,排序只需要 0.1 秒,而冒泡排序則需要 1 千萬秒,達到 115 天之久,是不是很嚇人?那有沒有既不浪費空間又可以快一點的排序演算法呢?那就是“快速排序”!
假設我們現在對“** 6 1 2 7 9 3 4 5 10 8”這 10 個數進行排序,首先在這個序列中隨便找一個數作為基準數(不要被這個名詞嚇到了,這就是一個用來參照的數,待會兒你就知道它用來做啥了),為了方便,就讓第一個數 6 作為基準數吧,接下來,需要將這個序列中所有比基準數大的數放在 6 的右邊,比基準數小的數放在 6 的左邊**,類似下面這種排列,

3 1 2 5 4 6 9 7 10 8

在初始狀態下,數字 6 在序列的第 1 位,我們的目標是將 6 挪到序列中間的某個位置,假設這個位置是 k,現在就需要尋找這個 k,并且以第 k 位為分界點,左邊的數都小于等于 6,右邊的數都大于等于 6,
?

方法其實很簡單:分別從初始序列“ 6 1 2 7 9 3 4 5 10 8”兩端開始“探測”,先從右往左找一個小于 6 的數,再從左往右找一個大于 6 的數,然后交換它們,這里可以用兩個變數 i 和 j,分別指向序列最左邊和最右邊,我們為這兩個變數起個好聽的名字“哨兵 i”和“哨兵 j”,剛開始的時候讓哨兵 i 指向序列的最左邊(即 i=1),指向數字 6,讓哨兵 j 指向序列的最右邊(即 j=10),指向數字 8,
image.png
image.png
image.png

圖源: 《啊哈演算法》

完整流程圖

image.png

如果mid取最左端的話,當本身有序時,會淪為冒泡排序,變成n平方

image.png

(例題)洛谷1177快速排序

https://www.luogu.com.cn/problem/P1177

錯誤版本

無優化,有序會TLE

#include <iostream>
#include<cstdio>
int a[1000001];//定義全域變數,這兩個變數需要在子函式中使用 

void swap(int* a, int* b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

//遞回方法
void quicksort(int left, int right) {
	//舉例子可得出若左邊大于等于右邊就回傳?
	//大于的情況是:index剛好==right,然后還要再去(index+1,right)
	if (left >= right) {
		return;
	}
	//默認基準index是最左邊那個,且i從左邊開始,j從右邊開始
	int i = left, j = right, index = left;

	//重構方法
	//大前提,兩個沒相遇
	while (i != j) {
		//里邊還得判斷一下i<j,因為外邊的大前提,里邊可能會破壞掉
		while (a[j] >= a[left]&&i<j) {
			j--;
		}
		while(a[i] <= a[left]&&i<j){
			i++;
		}
		//若i,j還未相遇
		if (i < j) {
			swap(&a[i], &a[j]);
		}
	}
	//出來時i,j必然相遇
	swap(&a[i],&a[index]);
    //將i賦值給基準
	index = i;

	quicksort(left, index - 1);
	quicksort(index + 1, right);
}

image.png

先取到mid,然后讓左邊跟mid交換

由于是單邊搜索,后兩個點都TLE

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <time.h>
void swap(int arr[], int i, int j)
{
    int temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
void QuickSort(int arr[], int left, int right)
{
    int i, pivot;

    if (left >= right)
        return;
    pivot = left;
    swap(arr, left, (left + right) / 2);
    for (i = left + 1; i <= right; i++) //單邊搜索,可以該為雙向搜索
        if (arr[i] < arr[left])
            swap(arr, i, ++pivot);
    swap(arr, left, pivot);
    QuickSort(arr, left, pivot - 1);
    QuickSort(arr, pivot + 1, right);
}
int main()
{
    int n;
    int *arr;
    int i;

    scanf("%d", &n);
    arr = (int*)malloc(sizeof(int) * (n + 1));
    for (i = 1; i <= n; i++)
        scanf("%d", arr + i);
    
    QuickSort(arr, 1, n); 
    for (i = 1; i <= n; i++)
        printf("%d ", arr[i]);
    return 0;
}

image.png

改進成雙邊搜索

只是最后一個點TLE了,而最后一個點,剛好就是常數列的情況

#include <iostream>
#include<cstdio>
int a[100010];//定義全域變數,這兩個變數需要在子函式中使用 

void swap(int* a, int* b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

//遞回方法
void quickSort(int left, int right) {
	//舉例子可得出若左邊大于等于右邊就回傳?
	//大于的情況是:index剛好==right,然后還要再去(index+1,right)
	if (left >= right) {
		return;
	}
	//默認基準index是最左邊那個,且i從左邊開始,j從右邊開始
	int i = left, j = right, index ;
	int mid=(left+right)/2;
	swap(&a[left],&a[mid]);
	index=left;

	//重構方法
	//大前提,兩個沒相遇
	while (i != j) {
		//里邊還得判斷一下i<j,因為外邊的大前提,里邊可能會破壞掉
		while (a[j] >= a[left]&&i<j) {
			j--;
		}
		while(a[i] <= a[left]&&i<j){
			i++;
		}
		//若i,j還未相遇
		if (i < j) {
			swap(&a[i], &a[j]);
		}
	}
	//出來時i,j必然相遇
	swap(&a[i],&a[index]);
	index = i;

	quickSort(left, index - 1);
	quickSort(index + 1, right);
}
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	quickSort(0, n - 1);
	for (int i = 0; i < n; i++) {
		i == n - 1 ? printf("%d", a[i]) : printf("%d ", a[i]);
	}
}

復盤mid(考慮常數列)

還沒三數取中,取到的mid是最小的話還是會退化到冒泡n平方

#include<cstdio>
#include<iostream>
using namespace std;
int a[100010];
//交換元素位置
void swap(int* a, int* b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
void quickSort(int* arr, int low, int high) {
	//若長度已經不符合要求,直接回傳
	if (low >= high) {
		return;
	}
	int left = low;
	int right = high;
	//選取中間為基準,注意是取中間的值,而不是下標,因為下標可能在后續交換中會改變
	//比如left走到了mid這里,而right停在了mid右邊,這時會去交換,arr[mid]就變了
	int mid = arr[(low + high) >> 1];
	while (left <= right) {
		//注意是小于,如果是小于等于的話,常數列就會一直left移動,而right不移動,淪為n平方
		while (arr[left] < mid) {
			left++;
		}
		//同樣注意是大于
		while (arr[right] > mid) {
			right--;
		}
		//這里要注意是小于或等于,以便于left和right直接跳到樞紐點的左右
		if (left <= right) {
			swap(&arr[left], &arr[right]);
			left++;
			right--;
		}
	}
	//遞回呼叫
    //right走到了區間一的尾部
	quickSort(arr,low, right);
    //left走到了區間二的頭部
	quickSort(arr, left, high);
}
int main()
{
	int n, i;
	cin >> n;
	for (i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	quickSort(a,1,n);
	for (i = 1; i <= n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}

流程圖

此處取到的mid是60

image.png

此時left和right已經相遇了

  • 然后left發現不滿足條件,86>mid(60),left還在86
    • right滿足條件,right去--,走到了15那里停下來
  • 然后left不滿足<=right,直接就要開始繼續遞回了
    • 遞回的區間①是: [42,15] (都小于等于60)
    • 區間②是 : [86,68] (都大于等于60)
		while (arr[left] < mid) {
			left++;
		}
		//同樣注意是大于
		while (arr[right] > mid) {
			right--;
		}
//這里要注意是小于或等于,以便于left和right直接跳到樞紐點的左右
		if (left <= right) {
			swap(&arr[left], &arr[right]);
			left++;
			right--;
		}
	//遞回呼叫
    //right走到了區間一的尾部
	quickSort(arr,low, right);
    //left走到了區間二的頭部
	quickSort(arr, left, high);

問題

因為沒有去把樞紐放到正確的位置,導致最后其實分出來的區間長度會多出一個元素:樞軸(這樣會很影響時間效率嗎)

自行用一定資料量測驗的話,時間效率上差距還算不上很大的,

**結合三數取中(暫時的神)

#include<cstdio>
#include<iostream>
#include"RcdSqList.h"
using namespace std;
//int a[100010];
//交換元素位置
void swap(int* a, int* b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
//三數取中
int getmid(int* array, int left, int right)
{
	int mid = left + ((right - left) >> 1);
	if (array[left] <= array[right])
	{
		if (array[mid] < array[left])
			return left;
		else if (array[mid] > array[right])
			return right;
		else
			return mid;
	}
	else
	{
		if (array[mid] < array[right])
			return right;
		else if (array[mid] > array[left])
			return left;
		else
			return mid;
	}
}
void quickSort(int* arr, int low, int high) {
	//若長度已經不符合要求,直接回傳
	if (low >= high) {
		return;
	}
	int left = low;
	int right = high;
	//選取中間為基準,注意是取中間的值,而不是下標,因為下標可能在后續交換中會改變
	//比如left走到了mid這里,而right停在了mid右邊,這時會去交換,arr[mid]就變了
	//呼叫三數取中,得到中間數
	int mid = arr[getmid(arr, low, high)];
	while (left <= right) {
		//注意是小于,如果是小于等于的話,常數列就會一直left移動,而right不移動,淪為n平方
		while (arr[left] < mid) {
			left++;
		}
		//同樣注意是大于
		while (arr[right] > mid) {
			right--;
		}
		//這里要注意是小于或等于,以便于left和right直接跳到樞紐點的左右
		if (left <= right) {
			swap(&arr[left], &arr[right]);
			left++;
			right--;
		}
	}
	//遞回呼叫
		//right走到了區間一的尾部
	quickSort(arr, low, right);
		//left走到了區間二的頭部
	quickSort(arr, left, high);
}
int main()
{
	int n, i;
	/*cin >> n;*/
	/*for (i = 1; i <= n; i++)
	{
		cin >> a[i];
	}*/
	int a[100] = { 0,42 ,90,30,86,42,15,57,20 };
	quickSort(a, 1, 8);
	for (i = 1; i <= 8; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}

總結

最后是下載了測驗點,然后看了博客,去找超時的原因,其實是完全有序
然后拿標準答案debug一下,終于發現了區別,就是常數列的時候他兩個都移動,我只是一個移動,就退化成n平方了

注意

要<號而不是<=

**要去放大問題,比如j一直往左走,要放大到一直走走走走到i那里去了!

看黑馬視頻得出的感悟....
這個問題很嚴重,會變成n平方
如果把基準放最左邊,而本身有序的話就會超時了

xxxx樞軸要選大小為中間的值,才能解決完全有序的情況(得三數取中.)

  • 注意這里的取中間值不是說取區間中間的值,而是大小在首尾區間中間數三個值排列居中的那個
    • 如果取的是區間中間的值,并不能解決完全有序的問題,比如 5 4 1 2 3 ,取mid等于1,又是取到了最小的情況,最后mid放到正確的位置(即第一個位置),遞回他的左右,并沒有起到把原區間化成兩半的效果,只是得到了右邊那一段,相當與只是減少了一個元素(類似冒泡的把一個元素放到正確的位置而已)

讓left++的條件應該是<號! , 交換完要順便讓left++,right--,這樣才能解決常數列的情況

如果我們不在交換完做移動的話,那>就得改成>=,這樣才會移動,但就變成單指標移動了,還是退化成n平方了

交換完移動后,left和right剛好就是兩個區間的首跟尾

**三向切割法

https://www.luogu.com.cn/problem/P1177(依舊是模板題)

先來看代碼

#include<cstdio>
#include<iostream>
using namespace std;
int a[100010];
//交換元素位置
void swap(int* a, int* b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
//三數取中
int getmid(int* array, int left, int right)
{
	int mid = left + ((right - left) >> 1);
	if (array[left] <= array[right])
	{
		if (array[mid] < array[left])
			return left;
		else if (array[mid] > array[right])
			return right;
		else
			return mid;
	}
	else
	{
		if (array[mid] < array[right])
			return right;
		else if (array[mid] > array[left])
			return left;
		else
			return mid;
	}
}
void quickSort_2(int rcd[], int low, int high) {
	if (low >= high) {
		return;
	}
    //呼叫三數取中,獲取樞紐位置
    int pivot=getmid(rcd,low,high);
    //把樞紐值放到low位置(交換)
    swap(&rcd[low],&rcd[pivot]);
    //樞紐值就等于rcd[low]
    int pivotVal = rcd[low];
    //i用來遍歷一趟區間	
	int left, right, i;
    //直接從樞紐的下一位開始遍歷區間
	left = low, right = high, i = low + 1;
	//遍歷整個區間
	while (i <= right) {
		//若小于樞紐值
		if (rcd[i] < pivotVal) {
			//得放到前邊,跟left交換
			swap(&rcd[i], &rcd[left]);
			//交換完,i換來了一個i前邊的值,肯定比較過了,所以i++
			i++;
			//left換來了一個i原來位置的值,也比較過了,所以left++
			left++;
		}
		//若大于樞紐值
		else if(rcd[i]>pivotVal)
		{
			//得放到后邊,跟right交換
			swap(&rcd[i], &rcd[right]);
			//right換來了一個i原來位置的值,也比較過了,所以right++
			right--;
			//i不動,因為換過來一個i后邊的新的值,還沒比較過
			
		}
		//等于的情況
		else
		{
			i++;
		}
	}
	quickSort_2(rcd, low, left - 1);
	quickSort_2(rcd, right + 1, high);
}
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	quickSort_2(a,0, n - 1);
	for (int i = 0; i < n; i++) {
		i == n - 1 ? printf("%d", a[i]) : printf("%d ", a[i]);
	}
}

粗糙的流程圖

這里我們先默認樞軸就是最左邊的元素就好了,方便理解(實際情況再按上邊代碼取中后跟最左邊交換即可)

用一個i去遍歷這個區間,還需要一個left和一個right指標

  • 當 rcd[i]大于樞紐值時,比如圖中的90
  • 當rcd[i]小于樞紐值時,比如圖中的20
  • 當rcd[i]等于樞紐值時,比如圖中的42

具體看圖中的文字說明

總結一下就是,如果該位置是一個已經跟樞紐值比較過了的值,或者換過來一個已經跟樞紐值比較過了的值(那就需要更新一下他的指標位置)
image.png

優勢

  • 減少了對重復元素的比較操作,因為重復元素在一次排序中就已經作為單獨一部分排好了,之后只需要對不等于該重復元素的其他元素進行排序,

寫在最后

  • 到了快排這里,其實已經涉及到一些遞回的知識,跟遞回相關的其實還有“折半查找”、“歸并排序”等,本專欄也還還會持續更新相關的知識,歡迎關注一起學習!

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

標籤:其他

上一篇:Redis 到底是怎么實作“附近的人”這個功能的?

下一篇:快速排序--洛谷卡TLE后最終我還是選擇了三向切割

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more