在一個數組中查找某一個元素,或是在一個字符串中查找某個字符,我們一般都會寫出如下代碼。這樣的代碼雖然簡潔明了,但在數組元素很多的情況下,並不是一個很好的解決方案,今天我就來分享一個提高查找速度的小技巧.
//在一個int數組中查找某個元素 int find(int A[],int n,int element) { for( int i = 0; i < n; i++ ) { if( A[i] == element ) return i; } return -1; } //在一個字符串中查找某個字符 int find(string& str,char c) { for( int i = 0; i < str.length(); i++ ) { if( str[i] == c ) return i; } return -1; }
雖然每次都是寫出這樣的代碼,但我總覺得for循環中的<判斷有點多余,比如數組中有100個元素,我們明明知道前99個是不會數組越界的,根本不需要判斷i<n的,但我們卻多判斷了99次,昨天晚上看編程珠玑的時候發現了這個小技巧,今天就來分享一下。
通過哨兵的方式去掉這多余的判斷,將上面兩個方法改造如下:
//在一個int數組中查找某個元素 int find1(int A[],int n,int element) { if( n <= 0 ) return -1; if( A[--n] == element ) return n; int hold = A[n]; A[n] = element; int i = 0; for( ; ; i++ ) { if( A[i] == element ) break; } A[n] = hold; return i < n ? i : -1; } //在一個字符串中查找某個字符 int find1(string& str,char c) { int n = str.length(); if( n <= 0 ) return -1; if( str[--n] == c ) return n; int hold = str[n]; str[n] = c; int i = 0; for( ; ; i++ ) { if( str[i] == c ) break; } str[n] = hold; return i < n ? i : -1; }
我勒個去,怎麼變得這麼長,但的確是減少了判斷的次數,如果數組較大的話提高運行速度肯定是一定的,如果你非要說數組很小的話,說不定速度還要降低呢,那你不這樣寫不就得了,好了廢話少說,雖然代碼已經很簡單明了了,但我還是簡單說一下思路。
就是在數組的末尾加一個哨兵,即使不判斷i<n也能確保數組不越界,加了哨兵之後if語句是必然會break的。
先判斷最後一個元素的值是不是我們要查找的數,如果是,返回其下標;如果不是,將最後一個數的值保存起來,將要查找的那個數賦給最後一個元素,循環查找指定的元素,不用判斷數組越界,if語句必然break,將最後一個元素的值還原,最後只用判斷i<n,如果是i即為所求,否則要查找的元素不在數組中。
最後在做一個簡單的性能測試,看到底能否提高查找速度。
測試代碼如下:
void testFind() { int N = 200000; int* A = new int[N]; A[N-2] = 1; DWORD start = ::GetTickCount64(); for( int i = 0; i < 10000; i++ ) find(A,N,1); DWORD end = ::GetTickCount64(); cout <<"優化前:" << end - start <<" 毫秒" << endl; start = ::GetTickCount64(); for( int i = 0; i < 10000; i++ ) find1(A,N,1); end = ::GetTickCount64(); cout <<"優化後:" << end - start <<" 毫秒" << endl; }
運行結果如下:
速度還是會快一點
1.去掉無關的選項
在Windows XP中,雙擊“控制面板”中的“文件夾選項”,再單擊“查看”標簽,然後將鼠標指針滾動至窗口的最下方,可以看到有一個“自動搜索網絡文件夾和打印機”項,默認是選中的,將它去掉。這樣,當我們打印時,Windows XP不會自作主張去尋找局域網上的打印機並安裝驅動程序,以防止不經意將機密文檔打到別的部門打印機上而自己卻還找不到。同時,將此項去掉後,當我們通過“網上鄰居”來訪問局域網電腦時,它不會自動查找其上的共享文件夾,這樣才會提升一些速度。
2.將網卡調至全速
按下Win+Pause/Break鍵,單擊“硬件”標簽,再單擊“設備管理器”從而打開“設備管理器”,雙擊“網絡適配器”下相應網卡,在打開窗口中單擊“高級”標簽,選中Speed & Duplex (連接速率/全.半雙工模式),再在其下選擇100 Mb Half.這樣可以讓網卡調至全速。當然,如果你使用的是無線網絡,則將其調至最高速即可,則是筆者的無線網卡D-Link AirPlus XtremeG+ DWL-G650+ Wireless Cardbus Adapter #2,筆者將其Desired Basic Rate Set(基本速率)設置為Up to 54Mbps.
3.去掉無關的協議
打開“網絡連接”窗口,右擊“本地連接”,選擇“屬性”,然後在打開窗口中將不需要的協議去掉。如果你使用Windows 98,則“TCP/IP -撥號適配器”、“Microsoft友好登錄”、“Microsoft虛擬專用網絡適配器”、“IPX/SPX兼容協議”等都可以去掉,因為這些組件平時不怎麼用到,如果選中它們的話,反而會影響工作站正常上網和浏覽。
4.設置空密碼登錄
如果電腦上沒有保存敏感數據,只是放一些公共的資源,那可以設置空密碼登錄。這樣用戶就不需要提供密碼就能夠直接進入,可以省卻告訴別人密碼的時間,也更加方便。
按下Win+R,輸入gpedit.msc,打開“組策略編輯器”,找到“計算機配置”→“Windows設置”→“安全設置”→“本地策略”→“安全選項”,再雙擊右側窗口中的“帳戶: 使用空白密碼的本地帳戶只允許進行控制台登錄”,在打開窗口中將其設置為“已禁用”。
接下來,在此機器上打開“資源管理器”,再選擇“工具”→“文件夾選項”,單擊“查看”標簽,然後取消“去除簡單文件共享(推薦)”前的小鉤。
5.自動登錄局域網
如果你每天都需要訪問某個共享文件夾,不需要按部就班地雙擊“網上鄰居”,然後找到服務器,雙擊後輸入用戶名和密碼再訪問。比如,你要訪問一個名為server的電腦,用戶名為user,密碼是8888.則只要寫一個bat文件,在其中輸入如下語句:net use serverIPC$ "8888" /user:"user",接著把該bat文件拖放到“開始→程序→啟動”組中,這樣一開機,系統就會以user為用戶名,8888為密碼登錄server電腦,這樣你在任何地方訪問它上面的共享文件夾則無需再輸入用戶名和密碼了。
如果你使用Windows XP,則可以在第一次打開共享電腦時,輸入用戶名和密碼後,選中“記住我的密碼”復選項,下次訪問時將不會再向我們索取密碼。
6.取消防火牆
如果你啟用了Windows XP中防火牆,且共享了驅動器,那有可能別人無法在“網絡鄰居”中浏覽共享驅動器,這時可以右擊“本地連接”,選擇“屬性”,再單擊“高級”標簽,......余下全文>>
1.去掉無關的選項
在WindowsXP中,雙擊“控制面板”中的“文件夾選項”,再單擊“查看”標簽,然後將鼠標指針滾動至窗口的最下方,可以看到有一個“自動搜索網絡文件夾和打印機”項,默認是選中的,將它去掉。這樣,當我們打印時,WindowsXP不會自作主張去尋找局域網上的打印機並安裝驅動程序,以防止不經意將機密文檔打到別的部門打印機上而自己卻還找不到。同時,將此項去掉後,當我們通過“網上鄰居”來訪問局域網電腦時,它不會自動查找其上的共享文件夾,這樣才會提升一些速度。
2.將網卡調至全速
按下Win+Pause/Break鍵,單擊“硬件”標簽,再單擊“設備管理器”從而打開“設備管理器”,雙擊“網絡適合器”下相應網卡,在打開窗口中單擊“高級”標簽,選中LinkSpeed/DuplexMode(連接速度/雙工模式),再在其下選擇100FullMode.這樣可以讓網卡調至全速。當然,如果你使用的是無線網絡,則將其調至最高速即可,則是筆者的無線網卡D-LinkAirPlusXtremeG+DWL-G650+WirelessCardbusAdapter#2,筆者將其DesiredBasicRateSet(基本速率)設置為Upto54Mbps.
3.去掉無關的協議
打開“網絡連接”窗口,右擊“本地連接”,選擇“屬性”,然後在打開窗口中將不需要的協議去掉。如果你使用Windows98,則“TCP/IP-撥號適配器”、“Microsoft友好登錄”、“Microsoft虛擬專用網絡適配器”、“IPX/SPX兼容協議”等都可以去掉,因為這些組件平時不怎麼用到,如果選中它們的話,反而會影響工作站正常上網和浏覽。
4.設置空密碼登錄
如果電腦上沒有保存敏感數據,只是放一些公共的資源,那可以設置空密碼登錄。這樣用戶就不需要提供密碼就能夠直接進入,可以省卻告訴別人密碼的時間,也更加方便。
按下Win+R,輸入gpedit.msc,打開“組策略編輯器”,找到“計算機配置”→“Windows設置”→“安全設置”→“本地策略”→“安全選項”,再雙擊右側窗口中的“帳戶:使用空白密碼的本地帳戶只允許進行控制台登錄”,在打開窗口中將其設置為“已禁用”。
接下來,在此機器上打開“資源管理器”,再選擇“工具”→“文件夾選項”,單擊“查看”標簽,然後取消“去除簡單文件共享(推薦)”前的小鉤。
5.自動登錄局域網
如果你每天都需要訪問某個共享文件夾,不需要按部就班地雙擊“網上鄰居”,然後找到服務器,雙擊後輸入用戶名和密碼再訪問。比如,你要訪問一個名為server的電腦,用戶名為user,密碼是8888.則只要寫一個bat文件,在其中輸入如下語句:netuseserverIPC$"8888"/user:"user",接著把該bat文件拖放到“開始→程序→啟動”組中,這樣一開機,系統就會以user為用戶名,8888為密碼登錄server電腦,這樣你在任何地方訪問它上面的共享文件夾則無需再輸入用戶名和密碼了。
如果你使用WindowsXP,則可以在第一次打開共享電腦時,輸入用戶名和密碼後,選中“記住我的密碼”復選項,下次訪問時將不會再向我們索取密碼。
6.取消防火牆
如果你啟用了WindowsXP中防火牆,且共享了驅動器,那有可能別人無法在“網絡鄰居”中浏覽共享驅動器,這時可以右擊“本地連接”,選擇“屬性”,再單擊“高級”......余下全文>>