`
异步获取爱
  • 浏览: 80784 次
  • 性别: Icon_minigender_1
  • 来自: 大男子主义世界
社区版块
存档分类
最新评论
文章列表
說明 搜尋的目的,是在「已排序的資料」中尋找指定的資料,而當中循序搜尋是最基本的搜尋法,只要從資料開頭尋找到最後,看看是否找到資料即可。 解法 初學者看到循序搜尋,多數都會使用以下的方式來進行搜尋: while(i < MAX) { if(number[i] == k) { printf("找到指定值"); break; } i++; } 這個方法基本上沒有錯,但是可以加以改善,可以利用設定衛兵的方式,省去if判斷式,衛兵通常設定在數列最後或是最前方,假設設定在列前方好了(索引0的位置),我們從數 ...

合并排序法

說明 之前所介紹的排序法都是在同一個陣列中的排序,考慮今日有兩筆或兩筆以上的資料,它可能是不同陣列中的資料,或是不同檔案中的資料,如何為它們進行排序? 解法 可以使用合併排序法,合併排序法基本是將兩筆已排序的資料合併並進行排序,如果所讀入的資料尚未排序,可以先利用其它的排序方式來處理這兩筆資料,然後再將排序好的這兩筆資料合併。 有人問道,如果兩筆資料本身就無排序順序,何不將所有的資料讀入,再一次進行排序?排序的精神是儘量利用資料已排序的部份,來加快排序的效率,小筆資料的排序較為快速,如果小筆資料排序完成之後,再合併處理時,因為兩筆資料都有排序了,所有在合併排序時會比單純讀入所有的資料再一次排序 ...
說明 之前說過軸的選擇是快速排序法的效率關鍵之一,在這邊的快速排序法的軸選擇方式更加快了快速排序法的效率,它是來自演算法名書 Introduction to Algorithms 之中。 解法 先說明這個快速排序法的概念,它以最右邊(或最左邊)的值s作比較的標準,將整個數列分為三個部份,一個是小於s的部份,一個是大於s的部份,一個是未處理的部份,如下所示 : 在排序的過程中,i 與 j 都會不斷的往右進行比較與交換,最後數列會變為以下的狀態: 然後將s的值置於中間,接下來就以相同的步驟會左右兩邊的數列進行排序的動作,如下所示: 整個演算的過程,直接摘錄書中的虛擬碼來作說明: QUI ...
說明 在 快速排序法(一) 中,每次將最左邊的元素設為軸,而之前曾經說過,快速排序法的加速在於軸的選擇,在這個例子中,只將軸設定為中間的元素,依這個元素作基準進行比較,這可以增加快速排序法的效率。 解法 在這個例子中,取中間的元素s作比較,同樣的先得右找比s大的索引 i,然後找比s小的索引 j,只要兩邊的索引還沒有交會,就交換 i 與 j 的元素值,這次不用再進行軸的交換了,因為在尋找交換的過程中,軸位置的元素也會參與交換的動作,例如: 41 24 76 11 45 64 21 69 19 36 首先left為0,right為9,(left+right)/2 = 4(取整數的商),所以軸為索引 ...
說明 快速排序法(quick sort)是目前所公認最快的排序方法之一(視解題的對象而定),雖然快速排序法在最差狀況下可以達O(n2),但是在多數的情況下,快速排序法的效率表現是相當不錯的。 快速排序法的基本精神是在數列中找出適當的軸心,然後將數列一分為二,分別對左邊與右邊數列進行排序,而影響快速排序法效率的正是軸心的選擇。 這邊所介紹的第一個快速排序法版本,是在多數的教科書上所提及的版本,因為它最容易理解,也最符合軸心分割與左右進行排序的概念,適合對初學者進行講解。 解法 這邊所介紹的快速演算如下:    1. 將最左邊的數設定為軸,並記錄其值為 s 廻圈處理:    1. 令索引 ...
說明 選擇排序法的概念簡單,每次從未排序部份選一最小值,插入已排序部份的後端,其時間主要花費於在整個未排序部份尋找最小值,如果能讓搜尋最小值的方式加快,選擇排序法的速率也就可以加快,Heap排序法讓搜尋的路徑由樹根至最後一個樹葉,而不是整個未排序部份,因而稱之為改良的選擇排序法。 解法 Heap排序法使用Heap Tree(堆積樹),樹是一種資料結構,而堆積樹是一個二元樹,也就是每一個父節點最多只有兩個子節點(關於樹的詳細定義還請見資料結構書籍),堆積樹的父節點若小於子節點,則稱之為最小堆積(Min Heap),父節點若大於子節點,則稱之為最大堆積(Max Heap),而同一層的子節點則無需理會 ...
    說明 請看看之前介紹過的氣泡排序法:    for(i = 0; i < MAX-1 && flag == 1; i++) { flag = 0; for(j = 0; j < MAX-i-1; j++) { if(number[j+1] < number[j]) { SWAP(number[j+1], number[j]); flag = 1; ...
Shell排序法最初是D.L Shell於1959所提出,假設要排序的元素有n個,則每次進行插入排序時並不是所有的元素同時進行時,而是取一段間隔。 Shell首先將間隔設定為n/2,然後跳躍進行插入排序,再來將間隔n/4,跳躍進行排序動作,再來間隔設定為n/8、n/16,直到間隔為1之後的最後一次排序終止,由於上一次的排序動作都會將固定間隔內的元素排序好,所以當間隔越來越小時,某些元素位於正確位置的機率越高,因此最後幾次的排序動作將可以大幅減低。 舉個例子來說,假設有一未排序的數字如右:89 12 65 97 61 81 27 2 61 98 數字的總數共有10個,所以第一次我們將間隔設定 ...
[size=medium]* 选择排序 將要排序的對象分作兩部份,一個是已排序的,一個是未排序的,從後端未排序部份選擇一個最小值,並放入前端已排序部份的最後一個,例如: 排序前:70 80 31 37 10 1 48 60 33 80    1. [1] 80 31 37 10 70 48 60 33 80 選出最小值1    2. [1 10] 31 37 80 70 48 60 33 80 選出最小值10    3. [1 10 31] 37 80 70 48 60 33 80 選出最小值31    4. [1 10 31 33] 80 70 48 60 37 80 ......    ...
   为什么存放在HashSet里面的对象,如果重写了equals()方法一定要写重写hashcode()方法,也就是说为什么要保证equals()方法比较相等的对象,其hashcode()方法返回值也要一样才可以。    首先,我给出一个例子大家看看,写一个Person类,只是覆盖了equals()方法。     class Person{ private String name; private int age; public Person(int age, String name) { super(); this.age = age; this.name ...
对Java核心概念和思想的掌握有助于提升我们对整个Java平台的理解力。这里将介绍四个Java中的核心技术思想,包括Java虚拟机、类装载器的体系结构、class文件和API。 Java已经成为一个庞大而复杂的技术平台,对于开发人员而言,要想更好的掌握Java技术,深入理解底层的技术处理细节必不可少。对核心概念和思想的掌握可以帮助我们举一反三、触类旁通,有助于提升我们对整个Java平台的理解力。这里所介绍的是Java技术平台的几个核心概念,其中所蕴含的思想有助于我们更深刻的理解Java技术。 Java虚拟机     Java虚拟机的主要任务是装在class文件并且执行其中的字节码。Java ...
像移动网关一样,iisforward这个ISAPI过滤器也会对request对象进行再包装,附加一些WLS要用的头信息。这种情况下,直接用request.getRemoteAddr()是无法取到真正的客户IP的。 实际的iisforward附加头如下: WL-Proxy-Client-IP=211.161.1.239 Proxy-Client-IP=211.161.1.239 X-Forwarded-For=211.161.1.239 WL-Proxy-Client-Keysize= WL-Proxy-Client-Secretkeysize= X-WebLogic-Request-Clus ...
<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443"/> <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" ...
lucene 2.4 开始有一个 NIOFSDirectory 实现,使用 java.nio's FileChannel 读取文件。官方说:在大多数非 windows 平台下,多个线程共用单个 searcher 比 FSDirectory(在同一时刻只能一个线程使用 searcher)可以提高查询的吞吐量。 lucene 2.4 的 CHANGE.TXT 说明: 21. LUCENE-753: Added new Directory implementation     org.apache.lucene.store.NIOFSDirectory, which uses java.nio's ...
    <1>.昨天改了一个晚上代码都无法使搜索引擎创建文件索引到硬盘中,经过调试发觉已经把文档、字段提取到了内存索引器中,然而在把内存索引书写器中的索引传递给硬盘索引书写器时似乎没有传送成功,只出现segments.gen和segments_2。单独使用FSDirectory时,却是在硬盘相应目录中能够看到索引文件啊!fsWriter.addIndexesNoOptimize(Directory[] {ramdir});明明已经写上了这句了啊?第二天上午翻翻资料,发觉有一份资料强调:     “在合并内存索引器的索引到硬盘索引器前,务必先关闭内存索引器。”     于是我试着在前面 ...
Global site tag (gtag.js) - Google Analytics