Giúp mình về giải thuật 1 chút

30 views
Skip to first unread message

dqvn...@gmail.com

unread,
Apr 23, 2012, 5:06:02 PM4/23/12
to phpvi...@googlegroups.com
Mình có 1 array trên PHP (cỡ 5000 items chứa số double dạng
"0.45678912345")
Giờ mình muốn tìm ra trong array đó 100 số lớn nhất (trả về index của
100 vị trí đó trong array trên)

Sort thì mình làm được nhưng để lấy ra vị trí index của 100 số đó mà ko
làm mất index thì mình chưa nghĩ ra cách nào hiệu quả nhất. Có cách nào
chạy 1->2 vòng for mà get ra được 100 index được ko nhỉ (mình bị áp lực
chỗ ko được clone ra nhiều array khác hoặc chạy for quá nhiều lần vì
mình xử lý với số lượng array như vậy khá thường xuyên).

Mong được các bác chỉ giáo (ý tưởng thôi cũng được ạ - mà có code demo
khúc for này thì dễ hiểu hơn :))

Thanks cả nhà nhiều.

Duy-Dinh Trinh (Mr.)

unread,
Apr 23, 2012, 9:30:15 PM4/23/12
to phpvi...@googlegroups.com
moi item them 1 bien luu gia tri index goc, vi vay khi sort thi minh tham chieu index goc ban dau. It is ok?



--
Bạn nhận được thư này vì bạn đã được đăng ký vào nhóm Google Groups "PHPVietnam".
Để đăng bài lên nhóm này, hãy gửi email đến phpvi...@googlegroups.com.
Để hủy đăng ký khỏi nhóm này, hãy gửi email tới phpvietnam+unsubscribe@googlegroups.com.
Để biết tùy chọn khác, hãy truy cập nhóm này tại http://groups.google.com/group/phpvietnam?hl=vi.


Nam Khanh Do

unread,
Apr 23, 2012, 9:52:16 PM4/23/12
to phpvi...@googlegroups.com
Mình ko biết thuật toán nhưng nếu dùng PHP để làm thì bạn chỉ cần 2 dòng sau là giải quyết được vấn đề :D
arsort($array_numbers);
$max_100_numbers = array_slice($array_numbers, 0, 100);

2012/4/24 Duy-Dinh Trinh (Mr.) <viet...@gmail.com>
Để hủy đăng ký khỏi nhóm này, hãy gửi email tới phpvietnam+...@googlegroups.com.

Để biết tùy chọn khác, hãy truy cập nhóm này tại http://groups.google.com/group/phpvietnam?hl=vi.



--
Best regards
Đỗ Nam Khánh
_________________________________

Mai Chân Chính

unread,
Apr 23, 2012, 10:53:51 PM4/23/12
to PHPVietnam, Nam Khanh Do
thế là học được một function mới rồi , lần sau gặp không sợ nữa

thank anh onam...@gmail.com đã chia sẻ

> >> Để hủy đăng ký khỏi nhóm này, hãy gửi email tới phpvietnam+unsubscribe@**
> >> googlegroups.com <phpvietnam%2Bunsu...@googlegroups.com>.


> >> Để biết tùy chọn khác, hãy truy cập nhóm này tại

> >>http://groups.google.com/**group/phpvietnam?hl=vi<http://groups.google.com/group/phpvietnam?hl=vi>


> >> .
>
> >  --
> > Bạn nhận được thư này vì bạn đã được đăng ký vào nhóm Google Groups
> > "PHPVietnam".
> > Để đăng bài lên nhóm này, hãy gửi email đến phpvi...@googlegroups.com.
> > Để hủy đăng ký khỏi nhóm này, hãy gửi email tới
> > phpvietnam+...@googlegroups.com.
> > Để biết tùy chọn khác, hãy truy cập nhóm này tại
> >http://groups.google.com/group/phpvietnam?hl=vi.
>
> --
> Best regards

> *Đỗ Nam Khánh
> *_________________________________

Phan Thái Trung

unread,
Apr 23, 2012, 10:59:37 PM4/23/12
to phpvi...@googlegroups.com, Nam Khanh Do
Lần sau gặp không sợ, chỉ sợ lần sau không gặp :))


2012/4/24 Mai Chân Chính <maichan...@gmail.com>

Nguyễn Hồng Quân

unread,
Apr 24, 2012, 9:31:38 AM4/24/12
to phpvi...@googlegroups.com, Nam Khanh Do
Làm vầy đâu lấy ra được index ban đầu đâu!

On 24/04/2012 08:52, Nam Khanh Do wrote:
> Mình ko biết thuật toán nhưng nếu dùng PHP để làm thì bạn chỉ cần 2
> dòng sau là giải quyết được vấn đề :D
>
> arsort($array_numbers);
> $max_100_numbers = array_slice($array_numbers, 0, 100);
>
>
> 2012/4/24 Duy-Dinh Trinh (Mr.) <viet...@gmail.com

> <mailto:viet...@gmail.com>>


>
> moi item them 1 bien luu gia tri index goc, vi vay khi sort thi
> minh tham chieu index goc ban dau. It is ok?
>
>
>

> 2012/4/24 dqvn...@gmail.com <mailto:dqvn...@gmail.com>
> <dqvn...@gmail.com <mailto:dqvn...@gmail.com>>


>
> Mình có 1 array trên PHP (cỡ 5000 items chứa số double dạng
> "0.45678912345")
> Giờ mình muốn tìm ra trong array đó 100 số lớn nhất (trả về
> index của 100 vị trí đó trong array trên)
>
> Sort thì mình làm được nhưng để lấy ra vị trí index của 100 số
> đó mà ko làm mất index thì mình chưa nghĩ ra cách nào hiệu quả
> nhất. Có cách nào chạy 1->2 vòng for mà get ra được 100 index
> được ko nhỉ (mình bị áp lực chỗ ko được clone ra nhiều array
> khác hoặc chạy for quá nhiều lần vì mình xử lý với số lượng
> array như vậy khá thường xuyên).
>
> Mong được các bác chỉ giáo (ý tưởng thôi cũng được ạ - mà có
> code demo khúc for này thì dễ hiểu hơn :))
>
> Thanks cả nhà nhiều.
>
> --
> Bạn nhận được thư này vì bạn đã được đăng ký vào nhóm Google
> Groups "PHPVietnam".
> Để đăng bài lên nhóm này, hãy gửi email đến

> phpvi...@googlegroups.com <mailto:phpvi...@googlegroups.com>.


> Để hủy đăng ký khỏi nhóm này, hãy gửi email tới

> phpvietnam+...@googlegroups.com
> <mailto:phpvietnam%2Bunsu...@googlegroups.com>.


> Để biết tùy chọn khác, hãy truy cập nhóm này tại
> http://groups.google.com/group/phpvietnam?hl=vi.
>
>
> --
> Bạn nhận được thư này vì bạn đã được đăng ký vào nhóm Google
> Groups "PHPVietnam".
> Để đăng bài lên nhóm này, hãy gửi email đến

> phpvi...@googlegroups.com <mailto:phpvi...@googlegroups.com>.


> Để hủy đăng ký khỏi nhóm này, hãy gửi email tới

> phpvietnam+...@googlegroups.com
> <mailto:phpvietnam%2Bunsu...@googlegroups.com>.


> Để biết tùy chọn khác, hãy truy cập nhóm này tại
> http://groups.google.com/group/phpvietnam?hl=vi.
>
>
>
>
> --
> Best regards

> *Đỗ Nam Khánh
> *_________________________________

Hai LX

unread,
Apr 24, 2012, 11:43:59 AM4/24/12
to phpvi...@googlegroups.com
<?php

function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a > $b) ? -1 : 1;
}

//create sample data
$data = array();
for ($i = 0; $i < 5000; $i++) {
    $data[$i] = rand(444444, 999999) / 999999;
}
//sort
uasort($data, 'cmp');
//top100
$top100 = array_slice($data, 0, 100);
var_dump($top100);
?>

Hai LX

unread,
Apr 24, 2012, 11:52:07 AM4/24/12
to phpvi...@googlegroups.com
hình như thiếu, thế này mới lấy được index
<?php

function cmp($a, $b) {
    $valuea = array_pop($a);
    $valueb = array_pop($b);
    if ($valuea == $valueb) {
        return 0;
    }
    return ($valuea > $valueb) ? -1 : 1;

}

//create sample data
$data = array();
for ($i = 0; $i < 5000; $i++) {
    $data[$i] = array($i => rand(444444, 999999) / 999999);

}
//sort
uasort($data, 'cmp');
//top100
$top100 = array_slice($data, 0, 100);
var_dump($top100);
?>

dqvn...@gmail.com

unread,
Apr 24, 2012, 11:54:28 AM4/24/12
to phpvi...@googlegroups.com
Thanks bạn Hải đã có thiện ý post code hướng dẫn mình.
Mình hiểu ý bác Nguyễn Hồng Quân về index rất giống với ý mình.
Vì việc tính trực tiếp và move các số chấm động (doubles) sẽ làm gia tăng công việc cho cpu và ram.
Vì vậy ý mình là giữ nguyên vị trí cái array $data[5000...] của mình và chỉ sort trên cái index thôi. Ví dụ:

$data[] = {0.5, 0.2, 0.6, 0.8, 0.1};
 // sau khi sort tra ve ket qua
$sorted[] = {4,1,0,2,3}

do đó nếu lấy top 3 mình chỉ cần cho $i chạy từ 0->2 get về $data[$sorted[$i]]

Thanks!

dqvn...@gmail.com

unread,
Apr 24, 2012, 12:15:13 PM4/24/12
to phpvi...@googlegroups.com
Đúng ý mình đó :)

Thanks bạn Hai LX nhiều :).
Reply all
Reply to author
Forward
0 new messages