İçeriğe geç
ShiftDelete.Net
Haber ara/ SDN'ye SorGiriş
Haber Akışı SDNTV İnceleme Forum Yapay Zeka Akıllı Telefon Elektrikli Otomobil Oyun ShiftDelete.Net Global Teknoloji Haberleri Mobil Otomobil Donanım Savunma Bilim Sosyal Medya İnternet Giyilebilir Teknoloji Rehber Ürünler Son dakika Yazarlar
  1. Ana sayfa
  2. Topluluk
  3. Programlama
  4. Programlama Dilleri
Programlama Dilleri

Algoritma sorunu

killbillgates15.08.201275 cevap9.343 görüntüleme
2012'den beri40 mesaj
#1
İyi günler hayırlı ramazanlar.
Şu problemi çözmemde yardımcı olursanız sevinirim.

Elimizde 10 adet sayı olsun. Bu sayıları 5'erlik iki gruba,grupların toplam değerleri birbirine mümkün olduğunca yakın olacak şekilde nasıl ayırabiliriz?
Cevaplar
Misafir
#2
:4:[6-0-9-2-5] [1-3-8-4-7] toplayınca 22 ile 23 oluyor
2007'den beri28 mesaj
#3
İlk aklıma geleni yazıyorum. 2 grup arasında olabilecek minimum fark yanılmıyorsam "1" dir. 2 grubun toplamlarını tutacak iki değişken tanımlarız ve 2 grubun toplamlarını bu değişkenlere aktarıp Do While döngüsünde while ((grup1-grup2<2) || grup2-grup1<2); şartı gerçekleşene kadar döngü çalışır. Performans değerlendirmesi tartışılır.
2010'den beri264 mesaj
#4
Artal73 dedi: ↑
İlk aklıma geleni yazıyorum. 2 grup arasında olabilecek minimum fark yanılmıyorsam "1" dir. 2 grubun toplamlarını tutacak iki değişken tanımlarız ve 2 grubun toplamlarını bu değişkenlere aktarıp Do While döngüsünde grup1-grup2<2 şartı gerçekleşene kadar döngü çalışır. Performans değerlendirmesi tartışılır.
(grup1 - grup 2) < 2 neden böyle birşey dediniz? Ayrıca grup elemanlarını nasıl bulmayı umuyorsunuz?
2007'den beri29 bin mesaj
#5
Böyle yılan şeklinde gitmeyi dene emin edeğilim belki tutar.

2007'den beri28 mesaj
#6
Ben bulmayı ummuyorum. Yapılacak iş biliyor oldugunu var sayarak bir birine yakın 2 grubu nasıl bulacağına dair ilk aklıma gelen fikri yazdım.
2010'den beri264 mesaj
#7
__kadıköyRAP__ dedi: ↑
Böyle yılan şeklinde gitmeyi dene emin edeğilim belki tutar.

Sıralı sayılarda en iyi çözüm yolu bu ama sayılar birbirinden çok uzak olursa işe yaramaz. Yani 45, 20 ,13, 3, gibi abidik gubidik sayılar halinde giderse o sırayla yaptığımızda aradaki fark açılır.
2007'den beri29 bin mesaj
#8
Peki küçükten büyüğe sıralayıp oldan sonra bu şekilde gruplara ayırsa yine olmaz mı?
2010'den beri264 mesaj
#9
__kadıköyRAP__ dedi: ↑
Peki küçükten büyüğe sıralayıp oldan sonra bu şekilde gruplara ayırsa yine olmaz mı?
Yine olacağını sanmıyorum, ilk aklıma gelen yol oydu. Lakin onda da şöyle bir sorun olabilir: En büyük sayı 93 diyelim sonrasında 40, 34, 20 filan diye gidiyor. Böyle olduğunda ilk gruba 93 giderken 2. gruba 40 gitmiş olucak bunda sorun yok ama devamında aynı algoritmayla birinci gruba 20 giderken 2. gruba 34 gidicek ( aradaki farkı dengelemek için ). Sorun da burda başlıyor, ilk gruba 20 yerine çok daha küçük bir sayı gitmeli ki aradaki fark en aza insin. Böylelikle bir sonraki turda 2. grup kalan sayılar içindeki en büyük sayıyı da alıp farkı küçültsün.

Yani, sizin önerdiğiniz ve benim de ilk aklıma gelen çözüm de etkili olmayacaktır..

Edit: Yazım hatası..
2012'den beri1.453 mesaj
#10
killbillgates dedi: ↑
İyi günler hayırlı ramazanlar.
Şu problemi çözmemde yardımcı olursanız sevinirim.

Elimizde 10 adet sayı olsun. Bu sayıları 5'erlik iki gruba,grupların toplam değerleri birbirine mümkün olduğunca yakın olacak şekilde nasıl ayırabiliriz?
(10 adet sayımız var ve bu sayıları bilmiyoruz bu nedenle onları a1-a2-a3-...-a9-a10 diye isimlendiriyorum)
1. başla
2. a1 - a10 sayılarını oku.
3. sayıları büyükten küçüğe (küçüten büyüğe de olabilir fark etmez) sırala
4. (1. sayı + 2. sayı + 9. sayı + 10. sayı + 5. sayı = 1. grup)
(3. sayı + 4. sayı + 6. sayı + 7. sayı + 8. sayı = 2. grup)
5. bitir
2010'den beri264 mesaj
#11
Piyonist dedi: ↑
(10 adet sayımız var ve bu sayıları bilmiyoruz bu nedenle onları a1-a2-a3-...-a9-a10 diye isimlendiriyorum)
1. başla
2. a1 - a10 sayılarını oku.
3. sayıları büyükten küçüğe (küçüten büyüğe de olabilir fark etmez) sırala
4. (1. sayı + 2. sayı + 9. sayı + 10. sayı + 5. sayı = 1. grup)
(3. sayı + 4. sayı + 6. sayı + 7. sayı + 8. sayı = 2. grup)
5. bitir
Bu çözüm yolu da az öncekine benziyor. Ilk 2 sayı birbirine çok yakın ver çok büyüklerse ve kalan sayılar birbirine yakın değerlerse bu algoritma da pek uygun bir çözüm olmayacaktır.

Hep muhalefet ediyor gibiyim ama en uygun sonucun elde edilmesin için uğraşıyorum. Programlamanın en önemli kısmı algoritma geliştirme kısmı olduğu aşikar, oluşturulan sağlam bir algoritma için kod yazmak gerçekten çok kolay bir iş.
2012'den beri1.453 mesaj
#12
__L__ dedi: ↑
Bu çözüm yolu da az öncekine benziyor. Ilk 2 sayı birbirine çok yakın ver çok büyüklerse ve kalan sayılar birbirine yakın değerlerse bu algoritma da pek uygun bir çözüm olmayacaktır.

Hep muhalefet ediyor gibiyim ama en uygun sonucun elde edilmesin için uğraşıyorum. Programlamanın en önemli kısmı algoritma geliştirme kısmı olduğu aşikar, oluşturulan sağlam bir algoritma için kod yazmak gerçekten çok kolay bir iş.
Algoritma zaten muhalefet işi eğer bir açık varsa o algoritma çöp demektir. Başka algoritma oluşturmayı deneyeyim.
2010'den beri264 mesaj
#13
Aklıma gelen bir yol var ama kağıt kalem alıp tam olarak oluşturmayı denemedim. Yarın sabah sağlam kafayla bir deneyeceğim. Şöyle ki:

Sayıların büyükten küçüğe sıralı olduğunu düşünelim, ilk sayı en büyük, 10. sayı en küçük.
1. sayı 1.gruba, 2. sayı 2. gruba burası kesin
2. tur için: 1. grup en küçük sayıyı alıcak ve içerisindeki sayıları toplayacak. 2. grup diğer kalan sayıları tek tek deneyecek. Yani 2. gruba 3. sayı gidip, 2. gruptaki elemanların toplamı alanacak. 1. grup ve 2. grup arasındaki fark en küçük olduğunda bir sonraki tura geçilecek ve tekrar aynı işlem uygulanacak.

Aslında kendim sayıları 2 gruba ayırırken de bu yolu düşünüyorum, aşağı yukarı tabi ki daha gelişmiş versiyonunu daha hızlı bir şekilde ( insan beyni muazzam bişi ). Yüzde 70 ihtimalle doğru sonucu çıkartıcaktır ama kesinlikle yeterli değil. Üzerine odaklanılıp geliştirilebilir.
2010'den beri6.907 mesaj
#14
Bütün sayıları toplayıp 2'ye böl.
Daha sonra bulduğun sonuca en yakın toplamı bul.
O toplamı veren 1.grup olur, kalanları 2.grup olarak ata.
2009'den beri4.659 mesaj
#15
benimde ilk aklıma gelen __kadıköyRAP__ inde dediği gibi sıralamaktı ama sonradan @__L__ nin dediği aklıma geldi olmaz dedim.

şöyle olmalı gruplara koyulan sayılar sürekli kontrol edilmeli.

mesele ilk sayılar diyelim 10 ve 50, iki gruba attık. sonraki sayılarda 70 ve 80 olsun bu iki sayı arasındada bir seçim olmalı bu sefer 70 ilk gruba değilde 2. gruba 80 de ilk gruba atılmalı. ve iki grup arasındaki fark gene kontrol edilmeli. ondan sonraki 2 sayıya geçelim onlarda 100 135 olsun. gene 135 ikinci gruba atılmalı ve 100 ilk gruba atılmalı.

yani kısaca dediğim şu ki gruplar arasındaki fark sürekli kontrol edilmeli. küçük olan gruba sıradaki 2 sayidan büyük olan eklenmeli. diğer sayida diğer gruba. sanırım en yakın böyle kontrol edebilirz. ama daha detaylıda olabilir. sadece sıradaki 2 sayı değilde diğer tüm sayılarıda kontrol edebilir. şöyle diyim mesela. iki grup arasında 40 fark varsa diğer sayılar arasındaki farklar kontrol edilmeli ve arasındaki fark 40 olan iki sayı seçilecek ve küçük gruba büyük sayı, büyük gruba küçük sayı gelecek şekilde ekleyecek.

tüm bunları algoritma olarak nasıl yazacaz orasını bilmiyorum ama benim fikrim böyle :)
Misafir
#16
1-tüm sayıları diziye büyükten küçüğe göre sırala
2-dizi içerisindeki sayıları topla
3-toplanan sayı tek ise 1 eksilt 2ye böl xTop ve yTop+1 şeklinde 2 dizi değişkene ata
toplanan sayı çift isede 2ye böl
4- x dizi değişkeni oluştur tüm sayıların bulunduğu dizideki ilk elemanı yazdır(ilk eleman büyük olan)
xTop dan sayıyı çıkar sonuc 0 a eşit ise diğer sayıları y dizisine at değil ise dön
2007'den beri29 bin mesaj
#17
bt38 dedi: ↑
Bütün sayıları toplayıp 2'ye böl.
Daha sonra bulduğun sonuca en yakın toplamı bul.
O toplamı veren 1.grup olur, kalanları 2.grup olarak ata.
Bunu yazmak için tekrar girmiştim konuya :)

Adam haklı bence de bu şekilde yap. 10'un 5'li kombinasyonu 10*9*8*7*6 = 30240 deneme yapacak program tabi nası yaptırırsın sana kalmış :D
2010'den beri6.907 mesaj
#18
Sanki eliyle toplayacak, bilgisayarın işi ne uğraşsın makine :P
2007'den beri29 bin mesaj
#19
Saniyede bilmem kaç milyon işlem yapıyor zaten :D
2012'den beri250 mesaj
#20
- Sayilari siralariz
- 1. + 10. A grubuna
- 2. + 9. B grubuna
- 3. + 8. A grubuna

Seklinde A ve B gruplari olusur. Toplamlar da birbirine yakin olur.
2010'den beri264 mesaj
#21
kizanlik dedi: ↑
- Sayilari siralariz
- 1. + 10. A grubuna
- 2. + 9. B grubuna
- 3. + 8. A grubuna

Seklinde A ve B gruplari olusur. Toplamlar da birbirine yakin olur.
Bunu yukarıda tartışmıştık zaten, toplamları birbirine yakın olmaz. Sayılara bağlı olarak çok değişiklik gösterir, birbiriyle hiç alakası olmayan 2 grup oluşturabilir.
bt38 in çözüm yolu mantıklı duruyor ama denemeden emin olunamaz. Şuana kadar çıkan en mantıklı sonuç bu gibi ama.
2012'den beri250 mesaj
#22
__L__ dedi: ↑
Bunu yukarıda tartışmıştık zaten, toplamları birbirine yakın olmaz. Sayılara bağlı olarak çok değişiklik gösterir, birbiriyle hiç alakası olmayan 2 grup oluşturabilir.
bt38 in çözüm yolu mantıklı duruyor ama denemeden emin olunamaz. Şuana kadar çıkan en mantıklı sonuç bu gibi ama.
Yukarida tartisilanla ayni sey degil. Ayrica, bir ornekle curutebilir misin?
2010'den beri264 mesaj
#23
kizanlik dedi: ↑
Yukarida tartisilanla ayni sey degil. Ayrica, bir ornekle curutebilir misin?
sayılar: 91, 23, 22, 21, 20, 19, 18, 17, 16, 15
2012'den beri250 mesaj
#24
Nasil curuttun anlamadim?

Daha ucuk ornek:
1, 2, 3, 100

Diyorum ki:
100 + 1 A grubu
2 + 3 B grubu

101 ve 5 var, fark 96

95 fark olacak sekilede dizebilir misin?
2010'den beri264 mesaj
#25
kizanlik dedi: ↑
Nasil curuttun anlamadim?

Daha ucuk ornek:
1, 2, 3, 100

Diyorum ki:
100 + 1 A grubu
2 + 3 B grubu

101 ve 5 var, fark 96

95 fark olacak sekilede dizebilir misin?

Yukarıda ne yazdığını unuttun sanırım. Hatırlatma olarak:

- Sayilari siralariz
- 1. + 10. A grubuna
- 2. + 9. B grubuna
- 3. + 8. A grubuna

Bu senin az önceki algoritmandı.

Edit: 10 tane sayı var elimizde..
2012'den beri250 mesaj
#26
__L__ dedi: ↑

Yukarıda ne yazdığını unuttun sanırım. Hatırlatma olarak:

- Sayilari siralariz
- 1. + 10. A grubuna
- 2. + 9. B grubuna
- 3. + 8. A grubuna

Bu senin az önceki algoritmandı.

Edit: 10 tane sayı var elimizde..
Size kolay gelsin...
2011'den beri597 mesaj
#27
Şimdi beyler o değil de, neden rakamların tek tek hangi grupta olması gerektiğine bilgisayar bakmıyor ?
hepsini denesin ve olabilecek en düşük ihtimalli sistemi kullanarak sayıları gruplara ayırsın...
2010'den beri264 mesaj
#28
LeaveNhA dedi: ↑
Şimdi beyler o değil de, neden rakamların tek tek hangi grupta olması gerektiğine bilgisayar bakmıyor ?
hepsini denesin ve olabilecek en düşük ihtimalli sistemi kullanarak sayıları gruplara ayırsın...
Rakamların hangi grupta olması gerektiğine neye göre bakıcak? Hepsini neye göre deneyecek?
2012'den beri4 mesaj
#29
Cevabi buldun mu bilmiyorum ama aklima geleni yaziyorum direk, butun olasiliklari dusunmeden yaziyorum. sayilarim toplaminin yarisini bul. sonra da elinde olan sayilardan herhangi bes tanesini toplayarak sayilarin ortalamasina en yakin olan secenegi bul. diger grupla minimum fark elinde olacaktir diye tahmin ediyorum. bi suru cevap gelmis, arada varsa buna benzer bu cevabi gormezden gelebilirsin :)
2011'den beri597 mesaj
#30
__L__ dedi: ↑
Rakamların hangi grupta olması gerektiğine neye göre bakıcak? Hepsini neye göre deneyecek?
10 rakamın kaç farklı dizilişi var ki ?
oturup tek tek yerleştirsin hepsini, baksın en az fark hangisinde, işi ne !?

Cevabını yaz

Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.