[討論] 排序與搜尋

看板MATLAB作者 (風過無痕)時間9年前 (2015/01/02 23:39), 9年前編輯推噓0(0039)
留言39則, 3人參與, 最新討論串1/1
假如我有一個x[6]=[3,5,3,1,2,4]; [a,index]=sort(x); 得到a=[1,2,3,3,4,5]; index=[4,5,1,3,6,2]; 但如果要分別找1,2,3,4,5分別是在排序後的第幾個數字 是不是只能分別找 有沒有辦法在排序時就用另一個矩陣存下來? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.202.193 ※ 文章網址: http://www.ptt.cc/bbs/MATLAB/M.1420213183.A.CA0.html

01/03 08:15, , 1F
排序後的 index 就是 1:length(x) 啊!
01/03 08:15, 1F

01/03 11:56, , 2F
樓上的意思是總長度? 但我要找的是例如我要找3是在
01/03 11:56, 2F

01/03 11:57, , 3F
排序後的哪個位置但每次要找一次不同的數字
01/03 11:57, 3F

01/03 11:57, , 4F
都要整個數列搜尋一次
01/03 11:57, 4F

01/03 11:57, , 5F
有沒有辦法在排序時就先存起來?
01/03 11:57, 5F

01/03 13:20, , 6F
就是1F說的index啊?
01/03 13:20, 6F

01/03 14:19, , 7F
a = [1,2,3,3,4,5]; iA = 1:length(a);
01/03 14:19, 7F

01/03 14:19, , 8F
iA = [1,2,3,4,5,6];
01/03 14:19, 8F

01/03 14:20, , 9F
01/03 14:20, 9F

01/03 14:21, , 10F
第 2 個 3 在第 4 個數字
01/03 14:21, 10F

01/03 14:26, , 11F
但這樣沒有對應關係要怎麼找?肉眼一看就知道但
01/03 14:26, 11F

01/03 14:27, , 12F
沒有建立一對一的對應關係所以還是要整個數列搜尋?
01/03 14:27, 12F

01/03 16:59, , 13F
..... 為啥你會認為 a 跟 iA 並非一對一對應
01/03 16:59, 13F

01/03 17:13, , 14F
因為知道'5'這個數字之後要一個一個從a[1]、a[2]...
01/03 17:13, 14F
※ 編輯: forb9823018 (140.113.202.193), 01/03/2015 17:14:57

01/03 17:16, , 15F
直到a[6]才找到 iA對找尋'5'這個數字並沒有幫助
01/03 17:16, 15F

01/03 17:25, , 16F
不管a是什麼,只要總長度一樣 iA永遠都一樣
01/03 17:25, 16F

01/03 17:29, , 17F
你該不會不知道有 find 這個 function 吧!!!
01/03 17:29, 17F

01/03 17:44, , 18F
那就等於每個數字都要find一次,也就是整個數列要找
01/03 17:44, 18F

01/03 17:45, , 19F
過一遍計算量會很大,在排序時有辦法就先排好嗎?
01/03 17:45, 19F

01/03 17:56, , 20F
我想到一個不算太聰明的辦法
01/03 17:56, 20F

01/03 17:56, , 21F
應該有更好的寫法
01/03 17:56, 21F

01/03 17:57, , 22F
就是排序完再跑一個迴圈
01/03 17:57, 22F

01/03 17:57, , 23F
1:length(a)
01/03 17:57, 23F

01/03 18:00, , 24F
for i=1:length(a)
01/03 18:00, 24F

01/03 18:04, , 25F
b[a[i]]=i; 不過要把重複數字的定義好
01/03 18:04, 25F
※ 編輯: forb9823018 (140.113.202.193), 01/03/2015 18:11:37

01/03 19:48, , 26F
排序問題隨便找一本資料結構就有
01/03 19:48, 26F

01/03 20:08, , 27F
亂入又不看懂問題 ... 他已經 sort 過了
01/03 20:08, 27F

01/03 20:08, , 28F
a=[1,2,3,3,4,5];
01/03 20:08, 28F

01/03 20:09, , 29F
index=[4,5,1,3,6,2]; 你要的是啥?
01/03 20:09, 29F

01/03 20:54, , 30F
就是打數值直接知道位置不用find還要花時間找
01/03 20:54, 30F

01/03 21:20, , 31F
??m大是指我嗎?我想說他要找一個複雜度低一點的演算法
01/03 21:20, 31F

01/03 21:20, , 32F
去找他要的東西
01/03 21:20, 32F

01/03 23:14, , 33F
sort沒問題,我想問的是能不能在排序時
01/03 23:14, 33F

01/03 23:14, , 34F
就順便做到我推文中程式碼的效果
01/03 23:14, 34F

01/03 23:15, , 35F
而不用再跑回圈給值一次
01/03 23:15, 35F

01/04 12:47, , 36F
問題是你的迴圈有問題啊 b[a[3]]=3 b[a[4]]=4
01/04 12:47, 36F

01/04 12:47, , 37F
所以 b[3]=3 被 b[3]=4 蓋掉了
01/04 12:47, 37F

01/04 15:25, , 38F
所以我後面附註有說要把重複的數字定義好
01/04 15:25, 38F

01/04 15:25, , 39F
至於要怎麼定義就看應用
01/04 15:25, 39F
文章代碼(AID): #1Kfhk_oW (MATLAB)