亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: emacsnw
打印 上一主題 下一主題

[算法] 剛看到的一個(gè)排序算法題,大家討論討論。 [復(fù)制鏈接]

論壇徽章:
0
21 [報(bào)告]
發(fā)表于 2006-12-29 13:35 |只看該作者
原帖由 ArXoR 于 2006-12-28 20:42 發(fā)表


如果數(shù)組是浮點(diǎn)數(shù), 但是題目保證輸入都是整數(shù)的話, 利用小數(shù)部分保存信息可以做到O(n)...
但是有點(diǎn)cheat了...


這個(gè)有點(diǎn)意思,不妨說來聽聽,呵呵。

論壇徽章:
0
22 [報(bào)告]
發(fā)表于 2006-12-29 13:40 |只看該作者
原帖由 tyc611 于 2006-12-29 13:31 發(fā)表

你這樣做,第一遍之后就把剩下的子序列打亂了,不知道你怎么處理剩下的


我想只需要做一遍就可以了
一個(gè)for搞定

論壇徽章:
0
23 [報(bào)告]
發(fā)表于 2006-12-29 14:12 |只看該作者
原帖由 emacsnw 于 12/29/06 13:35 發(fā)表


這個(gè)有點(diǎn)意思,不妨說來聽聽,呵呵。


就是首先, 問題的最優(yōu)解等于序列中元素的最大重復(fù)數(shù), 這個(gè)容易證明.

然后我們考慮下面這個(gè)簡(jiǎn)單的情形:


  1. 1
  2. 1      3      5
  3. 1  2  3  4  5
復(fù)制代碼


不嚴(yán)格的說:
我們每次只需要把這個(gè)形狀的天空線, 打印出來就行了
打印出來的值就刪掉, 比如輸出一個(gè)子序列后變成下面這樣:



  1. 1            
  2. 1     3     5
復(fù)制代碼


要實(shí)現(xiàn)這個(gè),
我們維護(hù)一個(gè)鏈表, 這個(gè)鏈表就是當(dāng)前這次掃描應(yīng)該輸出序列(不好意思...要描述還真是e...)
鏈表用Pi表示.

比如初始的時(shí)候P1=4, P4=5, P5=7, P7=8, P8=-1

然后每次輸出元素的時(shí)候維護(hù)這個(gè)指針序列就行了, 檢查一下是否對(duì)應(yīng)的值已經(jīng)用完, 沒完就加1, 完了就推進(jìn), 相當(dāng)于從鏈表中刪掉結(jié)點(diǎn), 設(shè)當(dāng)前待輸出子序列長度為k, 維護(hù)復(fù)雜度是O(k)的
由于每個(gè)元素最多被刪一次, 用平攤分析可以得到輸出完成的復(fù)雜度是O(n)
還可以添加一個(gè)在0位置的頭元素, P0始終指向鏈表頭, 方便統(tǒng)一處理.
而且初始的Pi可以在O(n)里完成

就是基于上面的算法, 可以看到Pi有界, 在[-1,n]中, 我們把小數(shù)部分分成[n+2]段, 就可以附加保存Pi了...

不考慮浮點(diǎn)誤差的話...應(yīng)該可以這樣...

BTW: 如果直接打印也算輔助空間的話...暫時(shí)沒轍了
cheat啊~~

Please correct me if I'm wrong.

論壇徽章:
0
24 [報(bào)告]
發(fā)表于 2006-12-29 14:28 |只看該作者
原帖由 ArXoR 于 2006-12-28 22:12 發(fā)表


就是首先, 問題的最優(yōu)解等于序列中元素的最大重復(fù)數(shù), 這個(gè)容易證明.

然后我們考慮下面這個(gè)簡(jiǎn)單的情形:


  1. 1
  2. 1      3      5
  3. 1  2  3  4  5
復(fù)制代碼


不嚴(yán)格的說:
我們每次只需要把這個(gè)形狀 ...


這個(gè)需要的空間不是O(1)的。

論壇徽章:
0
25 [報(bào)告]
發(fā)表于 2006-12-29 16:19 |只看該作者
原帖由 emacsnw 于 12/29/06 14:28 發(fā)表


這個(gè)需要的空間不是O(1)的。


嗯, 所以說是cheat...

論壇徽章:
0
26 [報(bào)告]
發(fā)表于 2006-12-29 17:01 |只看該作者

回復(fù) 1樓 emacsnw 的帖子

void divide_arr(int a[],int n){
        int i,j,cur,tmp;
        cur=0;
        while(cur<n){
            for(i=cur+1;i<n;i++){
                if(a[i]>a[cur]){
                    tmp=a[i];
                    for(j=i;j>=cur+1;j--)
                        a[j]=a[j-1];
                    a[cur+1]=tmp;
                    break;
                }

            }
            cur++;
        }
}


請(qǐng)高人指正!

論壇徽章:
0
27 [報(bào)告]
發(fā)表于 2006-12-29 18:01 |只看該作者

nli_224 的算法可以優(yōu)化

#include <iostream>
using namespace std;
void sort(int a[], int n)
{
        int cur = 0;
        int pos;
        int temp;
        pos = cur + 1;
        while(cur < n)
        {       
                if(pos >= n) //不需要每次都重新搜索
                        pos = cur + 1;
                for(; pos < n; ++pos)
                {
                        if(a[pos] > a[cur])
                        {
                                temp = a[pos];
                                for(int i = pos; i > cur + 1; --i)
                                        a[i] = a[i - 1];
                                a[cur + 1] = temp;
                                break;
                        }
                }               
                cur++;
        }
}
void main()
{
        int a[] = {1, 1, 1, 2, 3, 3, 4, 5, 5};
        int n = sizeof(a) / sizeof(int);
        sort(a, n);
        for(int i = 0; i < n; ++i)
        {
                cout << a[i] << " ";
        }
        cout << endl;
       
}

論壇徽章:
0
28 [報(bào)告]
發(fā)表于 2006-12-29 22:55 |只看該作者
大家興致這么高,索性也寫一個(gè)。有比O(n^2)更快的嗎?

  1. void unique(int a[],int n)
  2. {
  3.   int i=0,j,k,m;
  4.   while(i<n){
  5.     k=0;
  6.     j=i+1;
  7.     while(j<n){
  8.       if(a[j]==a[i])
  9.         k++;
  10.       else
  11.         a[j-k]=a[j];
  12.       j++;
  13.     }
  14.     for(j=n-k;j<n;j++)
  15.       a[j]=a[i];
  16.     i++;
  17.   }     
  18. }
復(fù)制代碼

論壇徽章:
0
29 [報(bào)告]
發(fā)表于 2006-12-30 13:38 |只看該作者
這個(gè)用python來寫復(fù)雜度怎么算啊?

  1. a=[1,1,1,2,3,3,4,5,5]
  2. i = 0
  3. b=len(a)
  4. while i<b:
  5.       if a[i:i+1] == a[i+1:i+2]:
  6.         a[i:] = a[i+2:]+a[i:i+1]
  7.      i=i+1


復(fù)制代碼

論壇徽章:
0
30 [報(bào)告]
發(fā)表于 2006-12-30 14:33 |只看該作者
我想了半天也只想出 crspo  圣騎士 的辦法
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP